Environment

# Libraries
library(tidyverse)
library(lubridate)
library(corrr)
library(corrplot)
library(ggpubr)
library(modelr)
library(effectsize)
library(glmpath)
library(glmnet)
library(MASS)
library(ggcorrplot)
library(broom)
library(ggfortify)
library(relaimpo)
library(olsrr)
library(parameters)
library(BayesFactor)
# for meff function
source('https://osf.io/ws6xc/download')

# Files 
home <- "~/Box/Mooddata_Coordinating/BABIES/Data/final_scored_data/"

eligible_id_file <- "~/Box/lucy_king_files/BABIES/lena_symptoms/inclusion_tracker_sub2.xlsx"
lena_edited_file <- "~/Box/lucy_king_files/BABIES/lena_symptoms/included_recording_dates.csv"
fp_intervention_id <- paste0(home, "lab_caregiving_behavior/free_play_intervention_assignment.csv")
itsea_file <- paste0(home, "survey_18month/itsea_scored_20201001.csv")
demographics_file <- paste0(home, "demographics/demo_6mo_cleaned_final.csv")
lena_file <- paste0(home, "LENA/lena_final_wf_day1_20200208_upto9months.csv")
ibq_file <- paste0(home, "IBQ/ibq_scored_final.csv")
sfp_care_file <- paste0(home, "lab_caregiving_behavior/PCIRS_sfp_wf_complete.csv")
fp_care_file <- paste0(home, "lab_caregiving_behavior/free_play_wf_8min_20200507.csv")
cesd_file <- paste0(home, "CESD/cesd_wf_20201001.csv")

# Functions
source("identify_outliers_histogram.R")

theme_lena <-
  theme_minimal() +
  theme(
    panel.grid = element_blank(),
    plot.title = element_text(size = 18, hjust = .5),
    axis.title = element_text(size = 18),
    axis.text = element_text(size = 16),
    legend.title = element_text(size = 18), 
    legend.text = element_text(size = 16),
    legend.position = "bottom"
  )

# Display options
options(scipen = 999)

Read in and join data

d0 <-
  readxl::read_xlsx(eligible_id_file, sheet = "data_filtered_T3") %>% 
  dplyr::select(
    ID,
    eligible,
    included
  ) %>% 
  filter(included == 1) %>% 
  left_join(
    read_csv(lena_edited_file) %>% 
      dplyr::select(
        ID, LENA_edited
      ),
    by = "ID"
  ) %>% 
  left_join(
    read_csv(demographics_file) %>% 
      dplyr::select(
        ID,
        baby_dob,
        education,
        education_txt,
        annual_income_txt,
        income_needs,
        male,
        mom_age,
        mom_latinx,
        mom_race,
        age_behav,
        secondlang,
        secondlang_type
      ),
    by = "ID"
  ) %>% 
  left_join(
    read_csv(itsea_file) %>% 
      dplyr::select(
        ID,
        survey_date,
        itsea_symptoms,
        itsea_activity,
        itsea_agress,
        itsea_gad,
        itsea_negemo,
        itsea_depp,
        itsea_intern,
        itsea_extern,
        # itsea symptoms items
        itsea_a2, 
        itsea_a4, 
        itsea_b8, 
        itsea_b10, 
        itsea_b27, 
        itsea_b32,
        itsea_a28, 
        itsea_a30, 
        itsea_a33, 
        itsea_b3, 
        itsea_b9, 
        itsea_b16, 
        itsea_b30, 
        itsea_b34, 
        itsea_b44, 
        itsea_b88, 
        itsea_c2, 
        itsea_e4,
        itsea_a9, 
        itsea_a39, 
        itsea_a40, 
        itsea_b43, 
        itsea_b76, 
        itsea_b81, 
        itsea_b84, 
        itsea_b91, 
        itsea_b92,
        itsea_a3, 
        itsea_a12, 
        itsea_a35, 
        itsea_b37, 
        itsea_b70, 
        itsea_b86, 
        itsea_e5, 
        itsea_e6, 
        itsea_e11,
        itsea_a7, 
        itsea_a21, 
        itsea_a23, 
        itsea_b31, 
        itsea_b45, 
        itsea_b50, 
        itsea_b53, 
        itsea_b59, 
        itsea_b65, 
        itsea_b66, 
        itsea_b74, 
        itsea_b80, 
        itsea_b85,
        itsea_concern_ied
      ), 
    by = "ID"
  ) %>% 
  mutate(
    survey_date =  parse_date_time(survey_date, orders = c("mdy HM")),
    age_18mo = (baby_dob %--% survey_date) / months(1)
  ) %>% 
  left_join(
    read_csv(fp_care_file) %>% 
      dplyr::select(ID, negmood_FP, sens_FP),
    by = "ID"
  ) %>% 
  left_join(
    read_csv(sfp_care_file) %>% 
      dplyr::select(ID, sens_R_M, sens_M),
    by = "ID"
  ) %>% 
  left_join(
    read_csv(ibq_file) %>% 
      dplyr::select(
        ID,
        #IBQ NEG items
        ibq_64, ibq_74, ibq_75, ibq_32, ibq_79, ibq_80,
        ibq_2, ibq_3_r, ibq_4, ibq_21, ibq_52, ibq_53, ibq_62,
        ibq_22, ibq_76, ibq_77, ibq_78, ibq_87, ibq_89,
        ibq_36, ibq_37, ibq_38, ibq_63, ibq_71, ibq_72,
        NEG
      ),
    by = "ID"
  ) %>% 
  left_join(read_csv(lena_file), by = "ID") %>% 
  left_join(read_csv(cesd_file), by = "ID") %>% 
  left_join(read_csv(fp_intervention_id), by = "ID") %>% 
  rename(
    age_lena_d1 = age,
    sens_r_sfp = sens_R_M,
    sens_sfp = sens_M,
    sens_fp = sens_FP,
    negmood_fp = negmood_FP
  ) 
Parsed with column specification:
cols(
  ID = col_double(),
  date_record = col_character(),
  LENA_edited = col_double()
)
Parsed with column specification:
cols(
  .default = col_double(),
  due_date = col_datetime(format = ""),
  baby_dob = col_datetime(format = ""),
  mom_dob = col_datetime(format = ""),
  baby_race = col_character(),
  baby_race_describe = col_character(),
  mom_race = col_character(),
  momrace_describe = col_character(),
  annual_income_txt = col_character(),
  education_txt = col_character(),
  employment_status_txt = col_character(),
  marital_status_txt = col_character(),
  partner_educ_txt = col_character(),
  partner_employ_txt = col_character(),
  questionnaire_only_date = col_date(format = ""),
  educ_describe = col_logical(),
  employment_explain = col_character(),
  mom_pob = col_character(),
  mom_native_lang = col_character(),
  primarylang = col_character(),
  secondlang_type = col_character()
  # ... with 24 more columns
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  survey_date = col_character(),
  baby_dob = col_datetime(format = ""),
  activity_concern = col_character(),
  agress_concern = col_character(),
  depp_concern = col_character(),
  gad_concern = col_character(),
  negemo_concern = col_character(),
  play_concern = col_character(),
  empathy_concern = col_character(),
  social_concern = col_character(),
  itsea_concern = col_character(),
  itsea_concern_ied = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  ID = col_double(),
  sens_FP = col_double(),
  intrus_FP = col_double(),
  posreg_FP = col_double(),
  stim_FP = col_double(),
  negreg_FP = col_double(),
  negmood_FP = col_double(),
  posmood_FP = col_double(),
  detach_FP = col_double()
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  ibq_timestamp = col_datetime(format = "")
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  date_record = col_date(format = ""),
  day_type = col_character(),
  lena_recordno = col_character(),
  lena_probyes = col_character(),
  other_caregiver = col_character(),
  lena_notes = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  ID = col_double(),
  cesd_t1 = col_double(),
  cesd_t2 = col_double(),
  cesd_t3 = col_double(),
  cesd_t4 = col_double(),
  cesd_t1_concern = col_character(),
  cesd_t2_concern = col_character(),
  cesd_t3_concern = col_character(),
  cesd_t4_concern = col_character()
)
Parsed with column specification:
cols(
  ID = col_double(),
  group = col_character()
)

Retention / Missing data

Dyads who completed the 6-month assessment (either lab or home observation), were eligible for the 18-month assessment (i.e., were age 18 months by the time of analysis), and completed the 18-month assessment are included in the current analyses.

#missing SFP
d0 %>% 
  count(is.na(sens_sfp))

#missing FP
d0 %>% 
  count(is.na(sens_fp))

#missing IBQ
d0 %>% 
  count(is.na(NEG))

d0 %>% 
  dplyr::select(
    awc_prop, 
    ctc_prop,
    awc_hour_max,
    ctc_hour_max,
    sens_r_sfp,
    sens_fp,
    NEG,
  ) %>% 
  pair_n()
             awc_prop ctc_prop awc_hour_max ctc_hour_max sens_r_sfp sens_fp NEG
awc_prop          100      100          100          100         94      96  96
ctc_prop          100      100          100          100         94      96  96
awc_hour_max      100      100          100          100         94      96  96
ctc_hour_max      100      100          100          100         94      96  96
sens_r_sfp         94       94           94           94         94      93  90
sens_fp            96       96           96           96         93      96  92
NEG                96       96           96           96         90      92  96
attr(,"class")
[1] "n_mat"  "matrix"

Descriptive statistics

IBQ, ITSEA reliability

d0 %>% 
  dplyr::select(ibq_64:ibq_72) %>% 
  psych::alpha(check.keys = TRUE)
Some items were negatively correlated with total scale and were automatically reversed.
 This is indicated by a negative sign for the variable name.

Reliability analysis   
Call: psych::alpha(x = ., check.keys = TRUE)

 

 lower alpha upper     95% confidence boundaries
0.84 0.87 0.91 

 Reliability if an item is dropped:

 Item statistics 

Non missing response frequency for each item
           1    2    3    4    5    6    7 miss
ibq_64  0.07 0.20 0.16 0.12 0.12 0.20 0.13 0.10
ibq_74  0.04 0.12 0.13 0.16 0.23 0.24 0.07 0.06
ibq_75  0.29 0.35 0.11 0.06 0.10 0.08 0.01 0.11
ibq_32  0.44 0.45 0.06 0.03 0.00 0.01 0.00 0.07
ibq_79  0.08 0.21 0.13 0.28 0.09 0.17 0.04 0.08
ibq_80  0.03 0.24 0.20 0.23 0.11 0.18 0.01 0.07
ibq_2   0.05 0.17 0.20 0.27 0.12 0.16 0.03 0.05
ibq_3_r 0.01 0.18 0.19 0.32 0.09 0.18 0.03 0.05
ibq_4   0.00 0.22 0.17 0.22 0.16 0.18 0.06 0.04
ibq_21  0.02 0.23 0.25 0.19 0.16 0.12 0.03 0.04
ibq_52  0.02 0.09 0.22 0.18 0.17 0.26 0.05 0.05
ibq_53  0.34 0.27 0.14 0.06 0.12 0.04 0.03 0.06
ibq_62  0.04 0.22 0.14 0.21 0.11 0.20 0.07 0.10
ibq_22  0.07 0.25 0.11 0.17 0.17 0.18 0.06 0.11
ibq_76  0.24 0.30 0.17 0.08 0.05 0.10 0.06 0.07
ibq_77  0.47 0.26 0.06 0.06 0.05 0.08 0.03 0.12
ibq_78  0.51 0.30 0.08 0.06 0.02 0.02 0.01 0.11
ibq_87  0.61 0.26 0.09 0.00 0.04 0.00 0.00 0.11
ibq_89  0.47 0.31 0.07 0.03 0.01 0.08 0.03 0.28
ibq_36  0.00 0.07 0.23 0.15 0.18 0.33 0.04 0.05
ibq_37  0.01 0.40 0.29 0.16 0.06 0.04 0.03 0.05
ibq_38  0.02 0.04 0.12 0.17 0.18 0.45 0.02 0.04
ibq_63  0.01 0.09 0.11 0.19 0.22 0.37 0.01 0.05
ibq_71  0.00 0.02 0.01 0.11 0.16 0.42 0.28 0.07
ibq_72  0.55 0.37 0.05 0.00 0.01 0.01 0.00 0.06
d0 %>% 
  dplyr::select(itsea_a2:itsea_b85, -itsea_c2) %>% 
  psych::alpha()
Item = itsea_e4 had no variance and was deleted but still is counted in the scoreSome items were negatively correlated with the total scale and probably 
should be reversed.  
To do this, run the function again with the 'check.keys=TRUE' option
Some items ( itsea_b84 itsea_a35 itsea_b37 itsea_e5 ) were negatively correlated with the total scale and 
probably should be reversed.  
To do this, run the function again with the 'check.keys=TRUE' option
Reliability analysis   
Call: psych::alpha(x = .)

 

 lower alpha upper     95% confidence boundaries
0.79 0.83 0.88 

 Reliability if an item is dropped:

 Item statistics 

Non missing response frequency for each item
             0    1    2 miss
itsea_a2  0.70 0.29 0.01 0.00
itsea_a4  0.46 0.41 0.13 0.00
itsea_b8  0.31 0.51 0.18 0.00
itsea_b10 0.19 0.56 0.25 0.00
itsea_b27 0.55 0.39 0.06 0.00
itsea_b32 0.82 0.14 0.04 0.01
itsea_a28 0.80 0.19 0.01 0.00
itsea_a30 0.72 0.28 0.00 0.00
itsea_a33 0.90 0.09 0.01 0.00
itsea_b3  0.53 0.45 0.02 0.00
itsea_b9  0.64 0.32 0.04 0.00
itsea_b16 0.67 0.31 0.02 0.00
itsea_b30 0.47 0.51 0.02 0.00
itsea_b34 0.92 0.07 0.01 0.00
itsea_b44 0.19 0.63 0.18 0.00
itsea_b88 0.41 0.54 0.05 0.00
itsea_a9  0.97 0.03 0.00 0.00
itsea_a39 0.94 0.06 0.00 0.00
itsea_a40 0.98 0.02 0.00 0.00
itsea_b43 0.78 0.20 0.02 0.01
itsea_b76 0.96 0.04 0.00 0.02
itsea_b81 0.97 0.03 0.00 0.00
itsea_b84 0.98 0.01 0.01 0.00
itsea_b91 0.99 0.01 0.00 0.00
itsea_b92 0.98 0.02 0.00 0.00
itsea_a3  0.89 0.10 0.01 0.00
itsea_a12 0.83 0.15 0.02 0.01
itsea_a35 0.80 0.17 0.03 0.00
itsea_b37 0.98 0.02 0.00 0.00
itsea_b70 0.78 0.19 0.03 0.01
itsea_b86 0.72 0.25 0.03 0.00
itsea_e5  0.77 0.21 0.02 0.00
itsea_e6  0.81 0.18 0.01 0.00
itsea_e11 0.92 0.07 0.01 0.00
itsea_a7  0.72 0.23 0.05 0.00
itsea_a21 0.58 0.40 0.02 0.01
itsea_a23 0.60 0.35 0.05 0.00
itsea_b31 0.10 0.77 0.13 0.00
itsea_b45 0.77 0.22 0.01 0.00
itsea_b50 0.69 0.27 0.04 0.00
itsea_b53 0.72 0.28 0.00 0.00
itsea_b59 0.42 0.51 0.07 0.00
itsea_b65 0.11 0.73 0.16 0.00
itsea_b66 0.82 0.16 0.02 0.01
itsea_b74 0.77 0.23 0.00 0.02
itsea_b80 0.78 0.17 0.05 0.01
itsea_b85 0.55 0.44 0.01 0.00
d0 %>% 
  summarize_at(
    vars(
      age_18mo,
      age_lena_d1,
      NEG,
      duration_total,
      duration_analyzed,
      ct_first_time,
      ct_last_time,
      cvc_hour_max,
      ctc_hour_max,
      awc_hour_max,
      ctc_prop,
      awc_prop,
      sens_r_sfp,
      sens_fp,
      negmood_fp,
      itsea_symptoms,
      mom_age,
      income_needs,
      percent_mother,
      cesd_t3,
      cesd_t4
    ), 
    funs(mean, sd, min, max), na.rm = TRUE
  )
`funs()` is deprecated as of dplyr 0.8.0.
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.
d0 %>% 
  count(male) %>% 
  mutate(
    per = n / sum(n)
  )

d0 %>% 
  count(itsea_concern_ied) %>% 
  mutate(
    per = n / sum(n)
  )

d0 %>% 
  count(income_needs < 1) %>% 
  mutate(
    per = n / sum(n)
  )

d0 %>% 
  count(mom_latinx) %>% 
  mutate(
    per = n / sum(n)
  )

d0 %>% 
  count(mom_race) %>% 
  mutate(
    per = n / sum(n)
  ) %>% 
  arrange(desc(n))

d0 %>% 
  count(education_txt) %>% 
  mutate(
    per = n / sum(n)
  ) %>% 
  arrange(education_txt)

d0 %>% 
  count(day_type) %>% 
  mutate(per = n / sum(n))

d0 %>% 
  count(cesd_t3 >= 16) %>% 
  mutate(per = n / sum(n))

d0 %>% 
  count(cesd_t4 >= 16) %>% 
  mutate(per = n / sum(n))
NA
d0 %>% 
  count(lena_mornstart, lena_recordfull)

d0 %>% 
  filter(lena_mornstart == 0) %>% 
  dplyr::select(
    ID, 
    lena_recordno, 
    ct_first_time, 
    ct_last_time, 
    duration_total, 
    duration_analyzed, 
    lena_notes
  )

Distributions

d0 %>% 
  identify_outliers_hist(x = cvc_hour_max)


d0 %>% 
  identify_outliers_hist(x = ctc_hour_max)


d0 %>% 
  identify_outliers_hist(x = ctc_prop)


d0 %>% 
  identify_outliers_hist(x = awc_hour_max)


d0 %>% 
  identify_outliers_hist(x = awc_prop)


d0 %>% 
  identify_outliers_hist(x = sens_r_sfp)


d0 %>% 
  identify_outliers_hist(x = sens_fp)


d0 %>% 
  identify_outliers_hist(x = itsea_symptoms)


d0 %>% 
  identify_outliers_hist(x = cesd_t3)


d0 %>% 
  identify_outliers_hist(x = cesd_t4)



d0 %>% 
  ggplot(aes(percent_mother)) +
  geom_histogram() +
  theme_lena +
  labs(
    x = "% of the LENA recording day infant with mother"
  )

ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/percent_mom_hist.png",
  width = 7,
  height = 5
)

Correlations

corr_lena <- 
  d0 %>%
  dplyr::select(
    `AW consistency` = awc_prop,
    `CT consistency` = ctc_prop,
    `AW quantity` = awc_hour_max,
    `CT quantity` = ctc_hour_max,
    `Infant vocalizations` = cvc_hour_max,
    `Sensitivity to distress` = sens_r_sfp,
    `Sensitivity during play` = sens_fp,
  ) %>% 
  correlate(use = "pairwise.complete.obs", method = "pearson") %>% 
  shave(upper = TRUE) %>% 
  fashion()  

Correlation method: 'pearson'
Missing treated using: 'pairwise.complete.obs'
corr_lena_plot <-
  corr_lena %>% 
  gather(variable, value, -rowname) %>% 
  mutate(
    variable = str_replace_all(variable, "\\.", " "),
    rowname = as.character(rowname),
    value_chr = as.character(value),
    value_chr = case_when(
      rowname == "CT consistency" & variable == "AW quantity" ~ ".23",
      rowname == "AW quantity" & variable == "CT consistency" ~ NA_character_,
      rowname == "Sensitivity to distress" & variable == "Sensitivity during play" ~ ".10",
      rowname == "Sensitivity during play" & variable == "Sensitivity to distress" ~ NA_character_,
      TRUE ~ value_chr
    ),
    value_num = as.numeric(value_chr)
  ) 
corr_lena_plot %>% 
  ggplot(aes(x = rowname, y = variable)) +
  geom_tile(aes(fill = abs(value_num))) +
  geom_text(
    aes(label = value_chr), 
    size = 4
  ) +
  scale_fill_gradient2(
    low = "blue",
    high = "red",
    mid = "white",
    na.value = "white",
    midpoint = 0,
    limit = c(-1, 1),
    space = "Lab",
    name = "Pearson correlation\ncoefficient"
  ) +
  theme_void() +
  theme(
    axis.text.x = element_text(
      angle = 45,
      hjust = 1,
      vjust = 1,
      size = 12
    ),
    axis.text.y = element_text(
      size = 12,
      hjust = 1.1
    )
  ) 

ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/plots/lena_corr_plot.eps", 
  dpi = 1000,
  height = 5, 
  width = 7
)

cor.test(d0$cesd_t3, d0$awc_hour_max)

    Pearson's product-moment correlation

data:  d0$cesd_t3 and d0$awc_hour_max
t = 0.70855, df = 98, p-value = 0.4803
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1268048  0.2641061
sample estimates:
       cor 
0.07139142 
cor.test(d0$cesd_t3, d0$awc_prop)

    Pearson's product-moment correlation

data:  d0$cesd_t3 and d0$awc_prop
t = 0.20234, df = 98, p-value = 0.8401
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1766922  0.2159863
sample estimates:
       cor 
0.02043509 
cor.test(d0$cesd_t3, d0$ctc_hour_max)

    Pearson's product-moment correlation

data:  d0$cesd_t3 and d0$ctc_hour_max
t = 0.30729, df = 98, p-value = 0.7593
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1664066  0.2260661
sample estimates:
       cor 
0.03102564 
cor.test(d0$cesd_t3, d0$ctc_prop)

    Pearson's product-moment correlation

data:  d0$cesd_t3 and d0$ctc_prop
t = -0.040919, df = 98, p-value = 0.9674
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2003889  0.1924409
sample estimates:
        cor 
-0.00413343 
cor.test(d0$cesd_t3, d0$cvc_hour_max)

    Pearson's product-moment correlation

data:  d0$cesd_t3 and d0$cvc_hour_max
t = 0.046727, df = 98, p-value = 0.9628
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1918759  0.2009519
sample estimates:
       cor 
0.00472013 
cor.test(d0$cesd_t3, d0$sens_r_sfp)

    Pearson's product-moment correlation

data:  d0$cesd_t3 and d0$sens_r_sfp
t = 0.75743, df = 92, p-value = 0.4507
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1259026  0.2769225
sample estimates:
       cor 
0.07872259 
cor.test(d0$cesd_t3, d0$sens_fp)

    Pearson's product-moment correlation

data:  d0$cesd_t3 and d0$sens_fp
t = -0.18924, df = 94, p-value = 0.8503
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2191435  0.1816818
sample estimates:
        cor 
-0.01951496 
cor.test(d0$NEG, d0$awc_hour_max)

    Pearson's product-moment correlation

data:  d0$NEG and d0$awc_hour_max
t = 0.81245, df = 94, p-value = 0.4186
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1189726  0.2793149
sample estimates:
       cor 
0.08350513 
cor.test(d0$NEG, d0$awc_prop)

    Pearson's product-moment correlation

data:  d0$NEG and d0$awc_prop
t = -0.52757, df = 94, p-value = 0.599
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2520746  0.1477609
sample estimates:
        cor 
-0.05433463 
cor.test(d0$NEG, d0$ctc_hour_max)

    Pearson's product-moment correlation

data:  d0$NEG and d0$ctc_hour_max
t = 1.4766, df = 94, p-value = 0.1431
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.05147543  0.34076399
sample estimates:
      cor 
0.1505644 
cor.test(d0$NEG, d0$ctc_prop)

    Pearson's product-moment correlation

data:  d0$NEG and d0$ctc_prop
t = -0.3159, df = 94, p-value = 0.7528
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2315400  0.1690237
sample estimates:
        cor 
-0.03256579 
cor.test(d0$NEG, d0$cvc_hour_max)

    Pearson's product-moment correlation

data:  d0$NEG and d0$cvc_hour_max
t = 0.24743, df = 94, p-value = 0.8051
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1758738  0.2248476
sample estimates:
       cor 
0.02551173 
cor.test(d0$NEG, d0$sens_r_sfp)

    Pearson's product-moment correlation

data:  d0$NEG and d0$sens_r_sfp
t = -0.2727, df = 88, p-value = 0.7857
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2347363  0.1791112
sample estimates:
        cor 
-0.02905776 
cor.test(d0$NEG, d0$sens_fp)

    Pearson's product-moment correlation

data:  d0$NEG and d0$sens_fp
t = -1.1946, df = 90, p-value = 0.2354
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.3215266  0.0819784
sample estimates:
       cor 
-0.1249368 
cor.test(d0$awc_hour_max, d0$sens_fp)
cor.test(d0$awc_hour_max, d0$sens_r_sfp)

cor.test(d0$ctc_hour_max, d0$sens_fp)
cor.test(d0$ctc_hour_max, d0$sens_r_sfp)

cor.test(d0$awc_prop, d0$sens_fp)
cor.test(d0$awc_prop, d0$sens_r_sfp)

cor.test(d0$ctc_prop, d0$sens_fp)
cor.test(d0$ctc_prop, d0$sens_r_sfp)

cor.test(d0$cvc_hour_max, d0$sens_fp)
cor.test(d0$cvc_hour_max, d0$sens_r_sfp)

cor.test(d0$sens_fp, d0$sens_r_sfp)

t-tests by bilingual status

t.test(d0$awc_hour_max ~ d0$secondlang)

    Welch Two Sample t-test

data:  d0$awc_hour_max by d0$secondlang
t = 0.28166, df = 94.674, p-value = 0.7788
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -503.7566  670.3237
sample estimates:
mean in group 0 mean in group 1 
       3549.149        3465.865 
t.test(d0$ctc_hour_max ~ d0$secondlang)

    Welch Two Sample t-test

data:  d0$ctc_hour_max by d0$secondlang
t = 0.47747, df = 91.869, p-value = 0.6342
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -9.311072 15.204689
sample estimates:
mean in group 0 mean in group 1 
       75.44681        72.50000 
t.test(d0$ctc_prop ~ d0$secondlang)

    Welch Two Sample t-test

data:  d0$ctc_prop by d0$secondlang
t = 0.87779, df = 96.693, p-value = 0.3822
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.02600516  0.06724637
sample estimates:
mean in group 0 mean in group 1 
      0.5561746       0.5355540 
t.test(d0$awc_prop ~ d0$secondlang)

    Welch Two Sample t-test

data:  d0$awc_prop by d0$secondlang
t = 0.52872, df = 96.086, p-value = 0.5982
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.03152325  0.05441354
sample estimates:
mean in group 0 mean in group 1 
      0.7422157       0.7307705 
t.test(d0$itsea_symptoms ~ d0$secondlang)

    Welch Two Sample t-test

data:  d0$itsea_symptoms by d0$secondlang
t = -0.34477, df = 96.903, p-value = 0.731
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.2353910  0.1657158
sample estimates:
mean in group 0 mean in group 1 
       1.053025        1.087863 

t-tests by day type

t.test(d0$awc_hour_max ~ d0$day_type)

    Welch Two Sample t-test

data:  d0$awc_hour_max by d0$day_type
t = -1.4866, df = 66.225, p-value = 0.1419
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1072.0120   156.9219
sample estimates:
mean in group weekday mean in group weekend 
             3348.369              3805.914 
t.test(d0$ctc_hour_max ~ d0$day_type)

    Welch Two Sample t-test

data:  d0$ctc_hour_max by d0$day_type
t = 1.0076, df = 69.607, p-value = 0.3171
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -6.267328 19.062933
sample estimates:
mean in group weekday mean in group weekend 
             76.36923              69.97143 
t.test(d0$ctc_prop ~ d0$day_type)

    Welch Two Sample t-test

data:  d0$ctc_prop by d0$day_type
t = 0.74512, df = 65.551, p-value = 0.4589
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.03151406  0.06903400
sample estimates:
mean in group weekday mean in group weekend 
            0.5534388             0.5346789 
t.test(d0$awc_prop ~ d0$day_type)

    Welch Two Sample t-test

data:  d0$awc_prop by d0$day_type
t = -1.4395, df = 68.83, p-value = 0.1545
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.07686127  0.01243104
sample estimates:
mean in group weekday mean in group weekend 
            0.7255763             0.7577915 

Histograms

d0 %>% 
  dplyr::select(
    ctc_hour_max,
    awc_hour_max,
    ctc_prop,
    awc_prop,
    sens_fp,
    sens_r_sfp
  ) %>% 
  gather(measure, value, ctc_hour_max:sens_r_sfp) %>% 
  mutate(
    measure = factor(
      measure,
      levels = c(
        "awc_prop",
        "ctc_prop",
        "awc_hour_max",
        "ctc_hour_max",
        "sens_r_sfp",
        "sens_fp"
      ),
      labels = c(
        "AW consistency", 
        "CT consistency", 
        "AW quantity", 
        "CT quantity",
        "Sensitivity to distress",
        "Sensivity during play"
        )
    )
  ) %>% 
  ggplot(aes(value)) +
  geom_histogram() +
  facet_wrap(.~measure, scales = "free", ncol = 2, nrow = 3) +
  theme_minimal() +
  theme(
    strip.text = element_text(size = 18),
    panel.grid = element_blank(),
    plot.title = element_text(size = 18, hjust = .5),
    axis.title = element_text(size = 18),
    axis.text = element_text(size = 16),
    legend.position = "none"
  ) +
  labs(
    x = "Caregiving input value"
  )


ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/plots/care_hist_ggpanels.png",
  width = 7.5,
  height = 8
)

d0 %>% 
  ggplot(aes(itsea_symptoms)) +
  geom_histogram() +
  scale_x_continuous(breaks = seq.int(0, 3, .25)) +
  theme_lena +
  labs(
    x = "Toddler symptoms of psychopathology"
  )

ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/plots/itsea_hist.png"
)
Saving 6.33 x 3.91 in image

d0 %>% 
  dplyr::select(
    Activity = itsea_activity,
    Aggression = itsea_agress,
    Depression = itsea_depp,
    Anxiety = itsea_gad,
    `Negative emotion` = itsea_negemo
  ) %>% 
  gather(itsea_subscale, score, Activity:`Negative emotion`) %>% 
  ggplot(aes(score)) +
  geom_histogram(bins = 12) +
  theme_lena +
  theme(
    strip.text = element_text(size = 16)
  ) +
  facet_wrap(.~itsea_subscale, scales = "free") +
  labs(
    x = "Subscale score"
  )

ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/plots/itsea_subscale_hist.png",
  width = 10,
  height = 7
)

d0 %>% 
  ggplot(aes(cesd_t3)) +
  geom_histogram() +
  scale_x_continuous(breaks = seq.int(0, 50, 5)) +
  theme_lena +
  labs(
    x = "Maternal depressive symptoms\n at infant age 6 months"
  )

ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/plots/cesd6_hist.png"
)
Saving 6.33 x 3.91 in image

d0 %>% 
  ggplot(aes(cesd_t4)) +
  geom_histogram() +
  scale_x_continuous(breaks = seq.int(0, 50, 5)) +
  theme_lena +
  labs(
    x = "Maternal depressive symptoms\n at infant age 18 months"
  )

ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/plots/cesd18_hist.png"
)
Saving 6.33 x 3.91 in image

Results

Associations of LENA measures with ITSEA symptoms

Effect code categorical variables

d0 <-
  d0 %>% 
  mutate(
    white = as.factor(
      if_else(
        mom_race == "White", 
        1, 0
      )
    ),
    male = as.factor(male),
    mom_latinx = as.factor(mom_latinx)
  )

contrasts(d0$male) <- c(-.5, .5)
contrasts(d0$white) <- c(-.5, .5)
contrasts(d0$mom_latinx) <- c(-.5, .5)

Formal model fitting

d0_lm <-
  d0 %>% 
  filter(!is.na(NEG))
mod_0 <-
  lm(
    scale(itsea_symptoms) ~
      1,
    data = d0_lm
  )
mod_cesdt3 <-
  lm(
    scale(itsea_symptoms) ~
      scale(cesd_t3),
    data = d0_lm
  )

anova(mod_0, mod_cesdt3)
Analysis of Variance Table

Model 1: scale(itsea_symptoms) ~ 1
Model 2: scale(itsea_symptoms) ~ scale(cesd_t3)
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     95 95.000                           
2     94 93.846  1    1.1538 1.1557 0.2851
mod_cesdt4 <-
  lm(
    scale(itsea_symptoms) ~
      scale(cesd_t4),
    data = d0_lm
  )

anova(mod_0, mod_cesdt4)
Analysis of Variance Table

Model 1: scale(itsea_symptoms) ~ 1
Model 2: scale(itsea_symptoms) ~ scale(cesd_t4)
  Res.Df    RSS Df Sum of Sq      F Pr(>F)  
1     95 95.000                             
2     94 91.346  1    3.6537 3.7598 0.0555 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
mod_neg <-
  lm(
    scale(itsea_symptoms) ~
      scale(cesd_t4) +
      scale(NEG),
    data = d0_lm
  )

anova(mod_cesdt4, mod_neg)
Analysis of Variance Table

Model 1: scale(itsea_symptoms) ~ scale(cesd_t4)
Model 2: scale(itsea_symptoms) ~ scale(cesd_t4) + scale(NEG)
  Res.Df    RSS Df Sum of Sq      F   Pr(>F)    
1     94 91.346                                 
2     93 81.119  1    10.227 11.725 0.000919 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
model_parameters(mod_neg)
Parameter   | Coefficient |   SE |        95% CI |        t | df |      p
-------------------------------------------------------------------------
(Intercept) |    9.39e-17 | 0.10 | [-0.19, 0.19] | 9.85e-16 | 93 | > .999
cesd_t4     |        0.18 | 0.10 | [-0.01, 0.37] |     1.84 | 93 | 0.069 
NEG         |        0.33 | 0.10 | [ 0.14, 0.52] |     3.42 | 93 | < .001
calc.relimp(mod_neg)
Response variable: scale(itsea_symptoms) 
Total response variance: 1 
Analysis based on 96 observations 

2 Regressors: 
scale(cesd_t4) scale(NEG) 
Proportion of variance explained by model: 14.61%
Metrics are not normalized (rela=FALSE). 

Relative importance metrics: 

                      lmg
scale(cesd_t4) 0.03476271
scale(NEG)     0.11135116

Average coefficients for different model sizes: 

                      1X       2Xs
scale(cesd_t4) 0.1961112 0.1765674
scale(NEG)     0.3391873 0.3286887
mod_Bage <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      scale(age_lena_d1),
    data = d0_lm
  )

anova(mod_neg, mod_Bage)
Analysis of Variance Table

Model 1: scale(itsea_symptoms) ~ scale(cesd_t4) + scale(NEG)
Model 2: scale(itsea_symptoms) ~ scale(NEG) + scale(cesd_t4) + scale(age_lena_d1)
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     93 81.119                           
2     92 79.246  1    1.8733 2.1748 0.1437
mod_Mage <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      scale(mom_age),
    data = d0_lm
  )

anova(mod_neg, mod_Mage)
Analysis of Variance Table

Model 1: scale(itsea_symptoms) ~ scale(cesd_t4) + scale(NEG)
Model 2: scale(itsea_symptoms) ~ scale(NEG) + scale(cesd_t4) + scale(mom_age)
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     93 81.119                           
2     92 78.782  1    2.3375 2.7298 0.1019
mod_race <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      white, 
    data = d0_lm
  )

anova(mod_neg, mod_race)
Analysis of Variance Table

Model 1: scale(itsea_symptoms) ~ scale(cesd_t4) + scale(NEG)
Model 2: scale(itsea_symptoms) ~ scale(NEG) + scale(cesd_t4) + white
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     93 81.119                           
2     92 80.305  1   0.81468 0.9333 0.3365
mod_ethnicity <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      mom_latinx, 
    data = d0_lm
  )

anova(mod_neg, mod_ethnicity)
Analysis of Variance Table

Model 1: scale(itsea_symptoms) ~ scale(cesd_t4) + scale(NEG)
Model 2: scale(itsea_symptoms) ~ scale(NEG) + scale(cesd_t4) + mom_latinx
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     93 81.119                           
2     92 79.287  1    1.8318 2.1255 0.1483
mod_education <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      scale(education),
    data = d0_lm
  )

anova(mod_neg, mod_education)
Analysis of Variance Table

Model 1: scale(itsea_symptoms) ~ scale(cesd_t4) + scale(NEG)
Model 2: scale(itsea_symptoms) ~ scale(NEG) + scale(cesd_t4) + scale(education)
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     93 81.119                           
2     92 79.548  1    1.5715 1.8175 0.1809
mod_income_needs <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      scale(income_needs), 
    data = d0_lm
  )

anova(mod_neg, mod_income_needs)
Analysis of Variance Table

Model 1: scale(itsea_symptoms) ~ scale(cesd_t4) + scale(NEG)
Model 2: scale(itsea_symptoms) ~ scale(NEG) + scale(cesd_t4) + scale(income_needs)
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     93 81.119                           
2     92 80.995  1   0.12377 0.1406 0.7086
mod_sex <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      male, 
    data = d0_lm
  )

anova(mod_neg, mod_sex)
Analysis of Variance Table

Model 1: scale(itsea_symptoms) ~ scale(cesd_t4) + scale(NEG)
Model 2: scale(itsea_symptoms) ~ scale(NEG) + scale(cesd_t4) + male
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     93 81.119                           
2     92 79.115  1     2.004 2.3304 0.1303

Consistency

AW

mod_awprop <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      scale(awc_prop),
    data = d0_lm
  )

model_parameters(mod_awprop)
Parameter   | Coefficient |   SE |         95% CI |        t | df |      p
--------------------------------------------------------------------------
(Intercept) |    1.22e-16 | 0.09 | [-0.19,  0.19] | 1.31e-15 | 92 | > .999
NEG         |        0.32 | 0.09 | [ 0.13,  0.50] |     3.36 | 92 | 0.001 
cesd_t4     |        0.20 | 0.09 | [ 0.01,  0.38] |     2.09 | 92 | 0.040 
awc_prop    |       -0.22 | 0.09 | [-0.41, -0.03] |    -2.32 | 92 | 0.023 
calc.relimp(mod_awprop)
Response variable: scale(itsea_symptoms) 
Total response variance: 1 
Analysis based on 96 observations 

3 Regressors: 
scale(NEG) scale(cesd_t4) scale(awc_prop) 
Proportion of variance explained by model: 19.33%
Metrics are not normalized (rela=FALSE). 

Relative importance metrics: 

                       lmg
scale(NEG)      0.10717209
scale(cesd_t4)  0.03851538
scale(awc_prop) 0.04762374

Average coefficients for different model sizes: 

                        1X        2Xs        3Xs
scale(NEG)       0.3391873  0.3284913  0.3156267
scale(cesd_t4)   0.1961112  0.1967953  0.1965872
scale(awc_prop) -0.2183248 -0.2189630 -0.2184895

CT

mod_ctprop <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      scale(ctc_prop),
    data = d0_lm
  )

model_parameters(mod_ctprop)
Parameter   | Coefficient |   SE |         95% CI |        t | df |      p
--------------------------------------------------------------------------
(Intercept) |    1.63e-17 | 0.09 | [-0.18,  0.18] | 1.76e-16 | 92 | > .999
NEG         |        0.32 | 0.09 | [ 0.13,  0.50] |     3.43 | 92 | < .001
cesd_t4     |        0.20 | 0.09 | [ 0.02,  0.39] |     2.16 | 92 | 0.034 
ctc_prop    |       -0.25 | 0.09 | [-0.43, -0.06] |    -2.63 | 92 | 0.010 
calc.relimp(mod_ctprop)
Response variable: scale(itsea_symptoms) 
Total response variance: 1 
Analysis based on 96 observations 

3 Regressors: 
scale(NEG) scale(cesd_t4) scale(ctc_prop) 
Proportion of variance explained by model: 20.6%
Metrics are not normalized (rela=FALSE). 

Relative importance metrics: 

                       lmg
scale(NEG)      0.10841060
scale(cesd_t4)  0.03952569
scale(ctc_prop) 0.05808721

Average coefficients for different model sizes: 

                        1X        2Xs        3Xs
scale(NEG)       0.3391873  0.3302660  0.3191677
scale(cesd_t4)   0.1961112  0.1993232  0.2018538
scale(ctc_prop) -0.2363189 -0.2420650 -0.2461931

Quantity

AW

mod_awmax<-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      scale(awc_hour_max),
    data = d0_lm
  )

model_parameters(mod_awmax)
Parameter    | Coefficient |   SE |        95% CI |        t | df |      p
--------------------------------------------------------------------------
(Intercept)  |    8.29e-17 | 0.10 | [-0.19, 0.19] | 8.67e-16 | 92 | > .999
NEG          |        0.33 | 0.10 | [ 0.14, 0.53] |     3.45 | 92 | < .001
cesd_t4      |        0.18 | 0.10 | [-0.01, 0.37] |     1.86 | 92 | 0.066 
awc_hour_max |       -0.06 | 0.10 | [-0.25, 0.13] |    -0.62 | 92 | 0.537 
calc.relimp(mod_awmax)
Response variable: scale(itsea_symptoms) 
Total response variance: 1 
Analysis based on 96 observations 

3 Regressors: 
scale(NEG) scale(cesd_t4) scale(awc_hour_max) 
Proportion of variance explained by model: 14.97%
Metrics are not normalized (rela=FALSE). 

Relative importance metrics: 

                            lmg
scale(NEG)          0.112514996
scale(cesd_t4)      0.035192701
scale(awc_hour_max) 0.001947467

Average coefficients for different model sizes: 

                             1X         2Xs         3Xs
scale(NEG)           0.33918734  0.33605409  0.33350200
scale(cesd_t4)       0.19611119  0.18725146  0.17959080
scale(awc_hour_max) -0.02200461 -0.04182114 -0.05979412

CT

mod_ctmax <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      scale(ctc_hour_max),
    data = d0_lm
  )

model_parameters(mod_ctmax)
Parameter    | Coefficient |   SE |         95% CI |        t | df |      p
---------------------------------------------------------------------------
(Intercept)  |    5.46e-17 | 0.09 | [-0.19,  0.19] | 5.86e-16 | 92 | > .999
NEG          |        0.36 | 0.09 | [ 0.17,  0.55] |     3.79 | 92 | < .001
cesd_t4      |        0.21 | 0.10 | [ 0.02,  0.40] |     2.23 | 92 | 0.028 
ctc_hour_max |       -0.22 | 0.10 | [-0.41, -0.03] |    -2.28 | 92 | 0.025 
calc.relimp(mod_ctmax)
Response variable: scale(itsea_symptoms) 
Total response variance: 1 
Analysis based on 96 observations 

3 Regressors: 
scale(NEG) scale(cesd_t4) scale(ctc_hour_max) 
Proportion of variance explained by model: 19.19%
Metrics are not normalized (rela=FALSE). 

Relative importance metrics: 

                           lmg
scale(NEG)          0.12030047
scale(cesd_t4)      0.04075023
scale(ctc_hour_max) 0.03087917

Average coefficients for different model sizes: 

                            1X        2Xs        3Xs
scale(NEG)           0.3391873  0.3478042  0.3596103
scale(cesd_t4)       0.1961112  0.2007037  0.2123774
scale(ctc_hour_max) -0.1289444 -0.1758479 -0.2195135

Infant vocalizations

mod_cvmax <-
  lm(
    scale(itsea_symptoms) ~
      scale(NEG) +
      scale(cesd_t4) +
      scale(cvc_hour_max),
    data = d0_lm
  )

model_parameters(mod_cvmax)
Parameter    | Coefficient |   SE |         95% CI |        t | df |      p
---------------------------------------------------------------------------
(Intercept)  |    5.25e-17 | 0.09 | [-0.18,  0.18] | 5.67e-16 | 92 | > .999
NEG          |        0.33 | 0.09 | [ 0.15,  0.52] |     3.56 | 92 | < .001
cesd_t4      |        0.22 | 0.09 | [ 0.03,  0.40] |     2.28 | 92 | 0.025 
cvc_hour_max |       -0.24 | 0.09 | [-0.43, -0.05] |    -2.54 | 92 | 0.013 
calc.relimp(mod_cvmax)
Response variable: scale(itsea_symptoms) 
Total response variance: 1 
Analysis based on 96 observations 

3 Regressors: 
scale(NEG) scale(cesd_t4) scale(cvc_hour_max) 
Proportion of variance explained by model: 20.21%
Metrics are not normalized (rela=FALSE). 

Relative importance metrics: 

                           lmg
scale(NEG)          0.11276570
scale(cesd_t4)      0.04185695
scale(cvc_hour_max) 0.04746378

Average coefficients for different model sizes: 

                            1X        2Xs        3Xs
scale(NEG)           0.3391873  0.3365568  0.3325144
scale(cesd_t4)       0.1961112  0.2052806  0.2151002
scale(cvc_hour_max) -0.1965144 -0.2198211 -0.2397697

Bayes Factors

model_d <-
  d0_lm %>% 
  dplyr::select(
    awc_prop,
    ctc_prop,
    awc_hour_max,
    ctc_hour_max,
    cvc_hour_max,
    itsea_symptoms,
    NEG,
    cesd_t4
  ) %>% 
  as.data.frame()

# each measure is compared to a covariate only model
lmBF_covonly = lmBF(itsea_symptoms ~ NEG + cesd_t4, data = model_d)

lmBF_awcprop = lmBF(itsea_symptoms ~ awc_prop + cesd_t4 + NEG, data = model_d)
lmBF_ctcprop = lmBF(itsea_symptoms ~ ctc_prop + cesd_t4 + NEG, data = model_d)

lmBF_awcmax = lmBF(itsea_symptoms ~ awc_hour_max + cesd_t4 + NEG, data = model_d)
lmBF_ctcmax = lmBF(itsea_symptoms ~ ctc_hour_max + cesd_t4 + NEG, data = model_d)

mBF_cvcmax = lmBF(itsea_symptoms ~ cvc_hour_max + cesd_t4 + NEG, data = model_d)

# BF for AW consistency
lmBF_awcprop / lmBF_covonly
Bayes factor analysis
--------------
[1] awc_prop + cesd_t4 + NEG : 3.008407 ±0%

Against denominator:
  itsea_symptoms ~ NEG + cesd_t4 
---
Bayes factor type: BFlinearModel, JZS
# BF for CT consistency
lmBF_ctcprop / lmBF_covonly
Bayes factor analysis
--------------
[1] ctc_prop + cesd_t4 + NEG : 5.794294 ±0%

Against denominator:
  itsea_symptoms ~ NEG + cesd_t4 
---
Bayes factor type: BFlinearModel, JZS
# BF for AW quantity
lmBF_awcmax / lmBF_covonly
Bayes factor analysis
--------------
[1] awc_hour_max + cesd_t4 + NEG : 0.3489947 ±0%

Against denominator:
  itsea_symptoms ~ NEG + cesd_t4 
---
Bayes factor type: BFlinearModel, JZS
# BF for CT quantity
lmBF_ctcmax / lmBF_covonly
Bayes factor analysis
--------------
[1] ctc_hour_max + cesd_t4 + NEG : 2.803794 ±0%

Against denominator:
  itsea_symptoms ~ NEG + cesd_t4 
---
Bayes factor type: BFlinearModel, JZS
# BF for infant vocalizations
mBF_cvcmax / lmBF_covonly
Bayes factor analysis
--------------
[1] cvc_hour_max + cesd_t4 + NEG : 4.723113 ±0%

Against denominator:
  itsea_symptoms ~ NEG + cesd_t4 
---
Bayes factor type: BFlinearModel, JZS

Create residualized symptoms variable for covariates in best fitting model

best_cov <- lm(
  itsea_symptoms ~
    scale(cesd_t4, scale = FALSE) +
    scale(NEG, scale = FALSE),
  data = d0
)

d0 <-
  d0 %>% 
  add_residuals(best_cov, var = "resid_symptoms")

Plot associations

AW consistency

d0 %>% 
  ggplot(aes(awc_prop, resid_symptoms)) +
  geom_point(size = 4, alpha = 1/2) +
  geom_smooth(method = "lm", size = 3, color = "black") +
  scale_x_continuous(
    breaks = seq.int(0, 1, .10),
    labels = scales::percent_format(accuracy = 1)
  ) +
  theme_minimal() +
  theme(
    strip.text = element_text(size = 17),
    panel.grid = element_blank(),
    plot.title = element_text(size = 18, hjust = .5),
    axis.title = element_text(size = 18),
    axis.text = element_text(size = 16),
    legend.position = "none"
  ) +
  labs(
    x = "Consistency of adult words in daily life",
    y = "Toddler symptoms of psychopathology\n(residuals)"
  )

ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/plots/aw_prop_symptoms.png",
  width = 7,
  height = 6
)

CT consistency

d0 %>% 
  ggplot(aes(ctc_prop, resid_symptoms)) +
  geom_point(size = 4, alpha = 1/2) +
  geom_smooth(method = "lm", size = 3, color = "black") +
  scale_x_continuous(
    breaks = seq.int(0, 1, .10),
    labels = scales::percent_format(accuracy = 1)
  ) +
  theme_minimal() +
  theme(
    strip.text = element_text(size = 17),
    panel.grid = element_blank(),
    plot.title = element_text(size = 18, hjust = .5),
    axis.title = element_text(size = 18),
    axis.text = element_text(size = 16),
    legend.position = "none"
  ) +
  labs(
    x = "Consistency of conversational turns in daily life",
    y = "Toddler symptoms of psychopathology\n(residuals)"
  )

ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/plots/ctc_prop_symptoms.png",
  width = 7,
  height = 6
)

Consistency

d0 %>% 
  dplyr::select(ctc_prop, awc_prop, resid_symptoms) %>% 
  rename(
    `CT consistency` = ctc_prop,
    `AW consistency` = awc_prop
  ) %>% 
  gather(measure, value, -resid_symptoms) %>% 
  ggplot(aes(value, resid_symptoms)) +
  geom_point(size = 4, alpha = 1/2) +
  geom_smooth(method = "lm", size = 3, color = "black") +
  scale_x_continuous(
    breaks = seq.int(0, 1, .15),
    labels = scales::percent_format(accuracy = 1)
  ) +
  theme_minimal() +
  theme(
    strip.text = element_text(size = 17),
    panel.grid = element_blank(),
    plot.title = element_text(size = 18, hjust = .5),
    axis.title = element_text(size = 18),
    axis.text = element_text(size = 16),
    legend.position = "none"
  ) +
  labs(
    x = "Consistency of language input in daily life",
    y = "Toddler symptoms of psychopathology\n(residuals)"
  ) +
  facet_grid(.~measure, scales = "free")

ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/plots/ctc_awc_prop_symptoms.eps",
  width = 10,
  height = 6,
  dpi = 1000
)

Infant vocalizations

d0 %>% 
  ggplot(aes(cvc_hour_max, resid_symptoms)) +
  geom_point(size = 4, alpha = 1/2) +
  geom_smooth(method = "lm", size = 3, color = "black") +
  scale_x_continuous(
    breaks = seq.int(0, 1000, 100)
  ) +
  theme_minimal() +
  theme(
    strip.text = element_text(size = 17),
    panel.grid = element_blank(),
    plot.title = element_text(size = 18, hjust = .5),
    axis.title = element_text(size = 18),
    axis.text = element_text(size = 16),
    legend.position = "none"
  ) +
  labs(
    x = "Quantity of infant vocalizations in daily life",
    y = "Toddler symptoms of psychopathology\n(residuals)"
  )

ggsave(
  "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/plots/cv_max_symptoms.png",
  width = 7,
  height = 6
)

Elastic net regression with LENA variables and covariates

Prepare data

z_score <- function(x) {
  diff_mu <- x - mean(x, na.rm = T)
  sd <- sd(x, na.rm = T)
  diff_mu / sd
}
d0_en <-
  d0 %>% 
  dplyr::select(
    itsea_symptoms,
    ctc_prop,
    awc_prop,
    ctc_hour_max,
    awc_hour_max,
    cvc_hour_max,
    cesd_t4,
    NEG
  ) %>% 
  mutate_at(
    vars(itsea_symptoms:NEG),
    funs(z_score)
  ) %>% 
  na.omit()
predictors <- 
  d0_en %>% 
  dplyr::select(-itsea_symptoms) %>% 
  as.matrix()
  
symptoms <- z_score(d0_en$itsea_symptoms)

Run model over 100 increasingly relaxed lambda values

fit_net <- glmnet(predictors, symptoms, family = "gaussian")
plot(fit_net, label = TRUE)

Run leave-one-out cross validation to identify optimal lambda value

If nfolds is set to the sample size = leave-one-out CV https://sciphy-stats.com/post/2019-01-25-finalizing-glmnet-models/ Running the CV 100 times to minimize simulation error.

# run cross validation
set.seed(123)

lambdaMins <- c()

for (i in 1:100) {
  fit_cv <- cv.glmnet(
    predictors, 
    symptoms, 
    type.measure = "mse", 
    family = "gaussian", 
    alpha = .5,
    nfolds = 96,
    grouped = FALSE
  )
  lambdaMins <- cbind(lambdaMins, fit_cv$lambda.min)
}
# save lambda corresponding to minimal mse to a tibble
lambdaMins <- as_tibble(lambdaMins)
The `x` argument of `as_tibble.matrix()` must have unique column names if `.name_repair` is omitted as of tibble 2.0.0.
Using compatibility `.name_repair`.
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.
lambdaMins <-
  lambdaMins %>%
  gather(run, lambdaMin, V1:V100) 

# calculate mean lambda value 
lambdaFinal <- mean(lambdaMins$lambdaMin)

Calculate EN model performance

# save model matrix
X <- model.matrix(itsea_symptoms ~ ., d0_en)

# get predicted values
y_hat <- matrix(X, ncol = 8) %*% as.matrix(coefs)

# calculate R-squared
r_sq <- 1 - (sum((y_hat[, 1] - symptoms)^2) / sum((symptoms - mean(symptoms))^2))

Evaluate model performance

for (i in 1000) {
  fit_rr_cv <- cv.glmnet(predictors, symptoms, type.measure = "mse", alpha = .5, family = "gaussian")
  lambdaMins <- cbind(lambdaMins, fit_rr_cv$lambda.min)
}

Additional analyses

Covarying maternal sensitivity

AW

sym_aw_ms <- 
  lm(
    scale(itsea_symptoms) ~ 
      scale(awc_prop) + 
      scale(cesd_t4) +
      scale(NEG) +
      scale(sens_fp) +
      scale(sens_r_sfp),
    data = d0 
  )


calc.relimp(sym_aw_ms)
Response variable: scale(itsea_symptoms) 
Total response variance: 1.019533 
Analysis based on 89 observations 

5 Regressors: 
scale(awc_prop) scale(cesd_t4) scale(NEG) scale(sens_fp) scale(sens_r_sfp) 
Proportion of variance explained by model: 24.51%
Metrics are not normalized (rela=FALSE). 

Relative importance metrics: 

                          lmg
scale(awc_prop)   0.052732752
scale(cesd_t4)    0.028702483
scale(NEG)        0.134788698
scale(sens_fp)    0.021700415
scale(sens_r_sfp) 0.007145296

Average coefficients for different model sizes: 

                           1X         2Xs         3Xs         4Xs        5Xs
scale(awc_prop)   -0.24321526 -0.23740095 -0.23135613 -0.22535320 -0.2196113
scale(cesd_t4)     0.17364596  0.16915053  0.16557711  0.16284424  0.1608910
scale(NEG)         0.40773727  0.39466127  0.38145121  0.36835829  0.3556209
scale(sens_fp)    -0.19538884 -0.17194599 -0.14911310 -0.12717659 -0.1064187
scale(sens_r_sfp)  0.08106572  0.08337868  0.08447331  0.08445072  0.0834660
model_parameters(sym_aw_ms)
Parameter   | Coefficient |   SE |         95% CI |     t | df |      p
-----------------------------------------------------------------------
(Intercept) |       -0.04 | 0.10 | [-0.23,  0.15] | -0.44 | 83 | 0.662 
awc_prop    |       -0.22 | 0.10 | [-0.41, -0.03] | -2.26 | 83 | 0.026 
cesd_t4     |        0.16 | 0.09 | [-0.03,  0.35] |  1.69 | 83 | 0.094 
NEG         |        0.36 | 0.10 | [ 0.16,  0.56] |  3.54 | 83 | < .001
sens_fp     |       -0.11 | 0.10 | [-0.31,  0.10] | -1.04 | 83 | 0.300 
sens_r_sfp  |        0.08 | 0.09 | [-0.11,  0.27] |  0.88 | 83 | 0.382 
sym_ct_ms <- 
  lm(
    scale(itsea_symptoms) ~ 
      scale(ctc_prop) +
      scale(cesd_t4) +
      scale(NEG) +
      scale(sens_fp) +
      scale(sens_r_sfp),
    data = d0 
  )

calc.relimp(sym_ct_ms)
Response variable: scale(itsea_symptoms) 
Total response variance: 1.019533 
Analysis based on 89 observations 

5 Regressors: 
scale(ctc_prop) scale(cesd_t4) scale(NEG) scale(sens_fp) scale(sens_r_sfp) 
Proportion of variance explained by model: 25.17%
Metrics are not normalized (rela=FALSE). 

Relative importance metrics: 

                          lmg
scale(ctc_prop)   0.055000215
scale(cesd_t4)    0.029029047
scale(NEG)        0.140378673
scale(sens_fp)    0.020233226
scale(sens_r_sfp) 0.007072563

Average coefficients for different model sizes: 

                           1X         2Xs         3Xs        4Xs         5Xs
scale(ctc_prop)   -0.23739588 -0.23580976 -0.23431447 -0.2331960 -0.23268930
scale(cesd_t4)     0.17364596  0.16932768  0.16620912  0.1643043  0.16364810
scale(NEG)         0.40773727  0.39784264  0.38836046  0.3795487  0.37165793
scale(sens_fp)    -0.19538884 -0.16943354 -0.14329989 -0.1171948 -0.09132713
scale(sens_r_sfp)  0.08106572  0.08349367  0.08442111  0.0838533  0.08183789
model_parameters(sym_ct_ms)
Parameter   | Coefficient |   SE |         95% CI |     t | df |      p
-----------------------------------------------------------------------
(Intercept) |       -0.05 | 0.10 | [-0.24,  0.14] | -0.56 | 83 | 0.579 
ctc_prop    |       -0.23 | 0.10 | [-0.42, -0.04] | -2.43 | 83 | 0.017 
cesd_t4     |        0.16 | 0.09 | [-0.02,  0.35] |  1.73 | 83 | 0.087 
NEG         |        0.37 | 0.10 | [ 0.17,  0.57] |  3.73 | 83 | < .001
sens_fp     |       -0.09 | 0.10 | [-0.29,  0.11] | -0.89 | 83 | 0.374 
sens_r_sfp  |        0.08 | 0.09 | [-0.11,  0.27] |  0.87 | 83 | 0.389 
cor.test(d0$sens_fp, d0$itsea_symptoms)

    Pearson's product-moment correlation

data:  d0$sens_fp and d0$itsea_symptoms
t = -1.8456, df = 94, p-value = 0.0681
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.37348462  0.01401018
sample estimates:
      cor 
-0.187001 
cor.test(d0$sens_r_sfp, d0$itsea_symptoms)

    Pearson's product-moment correlation

data:  d0$sens_r_sfp and d0$itsea_symptoms
t = 0.79113, df = 92, p-value = 0.4309
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1224545  0.2801529
sample estimates:
       cor 
0.08220199 

Who is talking?

d0_follow <-
  d0 %>% 
  filter(
    lena_caregivers___1 != 0 |
      lena_caregivers___2 != 0 |
      lena_caregivers___3 != 0 |
      lena_caregivers___4 != 0 |
      lena_caregivers___5 != 0 |
      lena_caregivers___6 != 0 |
      lena_caregivers___7 != 0 |
      lena_caregivers___8 != 0 |
      lena_caregivers___9 != 0 |
      lena_caregivers___10 != 0
  ) %>% 
  rename(
    mom_present = lena_caregivers___1,
    dad_present = lena_caregivers___2,
    daycare_present = lena_caregivers___3,
    nanny_present = lena_caregivers___4,
    sibling_present = lena_caregivers___5,
    cousin_present = lena_caregivers___6,
    grandparent_present = lena_caregivers___7,
    friends_present = lena_caregivers___8,
    relative_present = lena_caregivers___9, #any other relative
    other_present = lena_caregivers___10
  )
d0_follow %>% 
  count(!is.na(percent_mother))

d0_follow %>%
  summarise_at(
    vars(percent_mother),
    funs(mean, median, sd, min, max), na.rm = TRUE
  )

cor.test(d0_follow$percent_mother, d0_follow$ctc_prop, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$percent_mother and d0_follow$ctc_prop
S = 81475, p-value = 0.0774
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.2065836 
cor.test(d0_follow$percent_mother, d0_follow$awc_prop, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$percent_mother and d0_follow$awc_prop
S = 72960, p-value = 0.4954
alternative hypothesis: true rho is not equal to 0
sample estimates:
        rho 
-0.08049238 
cor.test(d0_follow$percent_mother, d0_follow$ctc_hour_max, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$percent_mother and d0_follow$ctc_hour_max
S = 85137, p-value = 0.0248
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.2608283 
cor.test(d0_follow$percent_mother, d0_follow$awc_hour_max, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$percent_mother and d0_follow$awc_hour_max
S = 76045, p-value = 0.2841
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.1261794 
cor.test(d0_follow$percent_mother, d0_follow$cvc_hour_max, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$percent_mother and d0_follow$cvc_hour_max
S = 78635, p-value = 0.1613
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
-0.164533 
cor.test(d0_follow$percent_mother, d0_follow$itsea_symptoms, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$percent_mother and d0_follow$itsea_symptoms
S = 61876, p-value = 0.4786
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.0836531 
d0_follow %>%
  count(mom_present) %>% 
  mutate(
    per = n / sum(n)
  )

d0_follow %>%
  count(dad_present) %>% 
  mutate(
    per = n / sum(n)
  )

d0_follow %>%
  count(mom_present, dad_present) %>% 
  mutate(
    per = n / sum(n)
  )

d0_follow %>%
  count(daycare_present) %>% 
  mutate(
    per = n / sum(n)
  )

d0_follow %>%
  count(nanny_present) %>% 
  mutate(
    per = n / sum(n)
  )

d0_follow %>%
  count(grandparent_present) %>% 
  mutate(
    per = n / sum(n)
  )

d0_follow %>%
  count(friends_present) %>% 
  mutate(
    per = n / sum(n)
  )

d0_follow %>%
  count(relative_present) %>% 
  mutate(
    per = n / sum(n)
  )

d0_follow %>%
  count(
    mom_present, 
    dad_present, 
    daycare_present, 
    nanny_present, 
    grandparent_present
  ) %>% 
  mutate(
    per = n / sum(n)
  ) %>% 
  arrange(n)
NA
d0_follow %>% 
  count(percent_mother) %>% 
  arrange(desc(n))
d0_follow <-
  d0_follow %>% 
  mutate(
    n_caregivers = 
      mom_present +
      dad_present +
      daycare_present +
      grandparent_present +
      nanny_present +
      friends_present +
      relative_present
  )

cor.test(d0_follow$ctc_prop, d0_follow$n_caregivers, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$ctc_prop and d0_follow$n_caregivers
S = 58928, p-value = 0.09238
alternative hypothesis: true rho is not equal to 0
sample estimates:
     rho 
0.194426 
cor.test(d0_follow$awc_prop, d0_follow$n_caregivers, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$awc_prop and d0_follow$n_caregivers
S = 61071, p-value = 0.154
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.1651252 
cor.test(d0_follow$ctc_hour_max, d0_follow$n_caregivers, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$ctc_hour_max and d0_follow$n_caregivers
S = 69248, p-value = 0.6472
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
0.05334703 
cor.test(d0_follow$awc_hour_max, d0_follow$n_caregivers, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$awc_hour_max and d0_follow$n_caregivers
S = 46296, p-value = 0.001106
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.3671023 
cor.test(d0_follow$cvc_hour_max, d0_follow$n_caregivers, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$cvc_hour_max and d0_follow$n_caregivers
S = 72778, p-value = 0.9653
alternative hypothesis: true rho is not equal to 0
sample estimates:
        rho 
0.005081446 
cor.test(d0_follow$itsea_symptoms, d0_follow$n_caregivers, method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  d0_follow$itsea_symptoms and d0_follow$n_caregivers
S = 80673, p-value = 0.3767
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.1028426 

LENA recording correlations: duration, etc.

d0 %>% 
  dplyr::select(
    ctc_prop,
    awc_prop,
    ctc_hour_max,
    awc_hour_max,
    duration_analyzed,
    duration_total,
    ct_first_time,
    ct_last_time
  ) %>% 
  correlate(method = "spearman") %>% 
  fashion()

Correlation method: 'spearman'
Missing treated using: 'pairwise.complete.obs'
cor.test(d0$ctc_prop, d0$duration_analyzed, method = "pearson")

    Pearson's product-moment correlation

data:  d0$ctc_prop and d0$duration_analyzed
t = -0.8847, df = 98, p-value = 0.3785
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2805269  0.1093159
sample estimates:
        cor 
-0.08901346 
cor.test(d0$awc_prop, d0$duration_analyzed, method = "pearson")

    Pearson's product-moment correlation

data:  d0$awc_prop and d0$duration_analyzed
t = -2.4278, df = 98, p-value = 0.01702
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.41518015 -0.04381767
sample estimates:
       cor 
-0.2381858 
cor.test(d0$ctc_hour_max, d0$duration_analyzed, method = "pearson")

    Pearson's product-moment correlation

data:  d0$ctc_hour_max and d0$duration_analyzed
t = 1.509, df = 98, p-value = 0.1345
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.04712287  0.33712968
sample estimates:
    cor 
0.15069 
cor.test(d0$awc_hour_max, d0$duration_analyzed, method = "pearson")

    Pearson's product-moment correlation

data:  d0$awc_hour_max and d0$duration_analyzed
t = 1.3002, df = 98, p-value = 0.1966
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.06793023  0.31849685
sample estimates:
      cor 
0.1302255 
cor.test(d0$ctc_prop, d0$ct_first_time, method = "pearson")

    Pearson's product-moment correlation

data:  d0$ctc_prop and d0$ct_first_time
t = -1.7196, df = 98, p-value = 0.08865
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.35561061  0.02615038
sample estimates:
       cor 
-0.1711468 
cor.test(d0$awc_prop, d0$ct_first_time, method = "pearson")

    Pearson's product-moment correlation

data:  d0$awc_prop and d0$ct_first_time
t = -0.20145, df = 98, p-value = 0.8408
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2159007  0.1767792
sample estimates:
        cor 
-0.02034532 
cor.test(d0$ctc_hour_max, d0$ct_first_time, method = "pearson")

    Pearson's product-moment correlation

data:  d0$ctc_hour_max and d0$ct_first_time
t = -2.1017, df = 98, p-value = 0.03814
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.38825834 -0.01173866
sample estimates:
       cor 
-0.2076779 
cor.test(d0$awc_hour_max, d0$ct_first_time, method = "pearson")

    Pearson's product-moment correlation

data:  d0$awc_hour_max and d0$ct_first_time
t = -2.0029, df = 98, p-value = 0.04795
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.37992144 -0.00195945
sample estimates:
       cor 
-0.1983012 
cor.test(d0$ctc_prop, d0$ct_last_time, method = "pearson")

    Pearson's product-moment correlation

data:  d0$ctc_prop and d0$ct_last_time
t = -2.6758, df = 98, p-value = 0.008739
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.43505086 -0.06799646
sample estimates:
       cor 
-0.2609297 
cor.test(d0$awc_prop, d0$ct_last_time, method = "pearson")

    Pearson's product-moment correlation

data:  d0$awc_prop and d0$ct_last_time
t = -2.4694, df = 98, p-value = 0.01526
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.41854994 -0.04788765
sample estimates:
       cor 
-0.2420292 
cor.test(d0$ctc_hour_max, d0$ct_last_time, method = "pearson")

    Pearson's product-moment correlation

data:  d0$ctc_hour_max and d0$ct_last_time
t = -0.92389, df = 98, p-value = 0.3578
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2841549  0.1054191
sample estimates:
        cor 
-0.09292313 
cor.test(d0$awc_hour_max, d0$ct_last_time, method = "pearson")

    Pearson's product-moment correlation

data:  d0$awc_hour_max and d0$ct_last_time
t = -1.3196, df = 98, p-value = 0.19
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.32023976  0.06599806
sample estimates:
       cor 
-0.1321329 
cor.test(d0$ct_last_time, d0$ct_first_time, method = "pearson")

    Pearson's product-moment correlation

data:  d0$ct_last_time and d0$ct_first_time
t = 6.7365, df = 98, p-value = 0.000000001118
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.4116546 0.6834769
sample estimates:
      cor 
0.5625842 
d0 %>% 
  ggplot(aes(duration_analyzed, awc_prop)) +
  geom_point() +
  geom_smooth(method = "lm")


d0 %>% 
  ggplot(aes(ct_first_time, awc_hour_max)) +
  geom_point() +
  geom_smooth(method = "lm")


d0 %>% 
  ggplot(aes(ct_first_time, ctc_hour_max)) +
  geom_point() +
  geom_smooth(method = "lm")


d0 %>% 
  ggplot(aes(ct_last_time, awc_prop)) +
  geom_point() +
  geom_smooth(method = "lm")


d0 %>% 
  ggplot(aes(ct_last_time, ctc_prop)) +
  geom_point() +
  geom_smooth(method = "lm")

CT and AW rate variables and symptoms

cor.test(d0$ctc_rate, d0$itsea_symptoms)

    Pearson's product-moment correlation

data:  d0$ctc_rate and d0$itsea_symptoms
t = -1.8434, df = 98, p-value = 0.06829
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.36631497  0.01384722
sample estimates:
       cor 
-0.1830688 
cor.test(d0$awc_rate, d0$itsea_symptoms)

    Pearson's product-moment correlation

data:  d0$awc_rate and d0$itsea_symptoms
t = -1.5658, df = 98, p-value = 0.1206
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.34214889  0.04146029
sample estimates:
       cor 
-0.1562301 
#write_csv(d0, "~/Box/lucy_king_files/BABIES/lena_symptoms/manuscript/dev_science/king_analyzed_data_20200528.csv")
LS0tCnRpdGxlOiAiQW5hbHlzZXMgZm9yIF9EaW1lbnNpb25zIG9mIHRoZSBsYW5ndWFnZSBlbnZpcm9ubWVudCBpbiBpbmZhbmN5IGFuZCBlbWVyZ2luZyBwc3ljaG9wYXRob2xvZ3kgaW4gdG9kZGxlcmhvb2RfIgphdXRob3I6ICJMdWN5IFMuIEtpbmciCmRhdGU6ICIyMDIwIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMgotLS0KCiMgRW52aXJvbm1lbnQKYGBge3Igc2V0dXB9CiMgTGlicmFyaWVzCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShjb3JycikKbGlicmFyeShjb3JycGxvdCkKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkobW9kZWxyKQpsaWJyYXJ5KGVmZmVjdHNpemUpCmxpYnJhcnkoZ2xtcGF0aCkKbGlicmFyeShnbG1uZXQpCmxpYnJhcnkoTUFTUykKbGlicmFyeShnZ2NvcnJwbG90KQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGdnZm9ydGlmeSkKbGlicmFyeShyZWxhaW1wbykKbGlicmFyeShvbHNycikKbGlicmFyeShwYXJhbWV0ZXJzKQpsaWJyYXJ5KEJheWVzRmFjdG9yKQoKIyBGaWxlcyAKaG9tZSA8LSAifi9Cb3gvTW9vZGRhdGFfQ29vcmRpbmF0aW5nL0JBQklFUy9EYXRhL2ZpbmFsX3Njb3JlZF9kYXRhLyIKCmVsaWdpYmxlX2lkX2ZpbGUgPC0gIn4vQm94L2x1Y3lfa2luZ19maWxlcy9CQUJJRVMvbGVuYV9zeW1wdG9tcy9pbmNsdXNpb25fdHJhY2tlcl9zdWIyLnhsc3giCmxlbmFfZWRpdGVkX2ZpbGUgPC0gIn4vQm94L2x1Y3lfa2luZ19maWxlcy9CQUJJRVMvbGVuYV9zeW1wdG9tcy9pbmNsdWRlZF9yZWNvcmRpbmdfZGF0ZXMuY3N2IgpmcF9pbnRlcnZlbnRpb25faWQgPC0gcGFzdGUwKGhvbWUsICJsYWJfY2FyZWdpdmluZ19iZWhhdmlvci9mcmVlX3BsYXlfaW50ZXJ2ZW50aW9uX2Fzc2lnbm1lbnQuY3N2IikKaXRzZWFfZmlsZSA8LSBwYXN0ZTAoaG9tZSwgInN1cnZleV8xOG1vbnRoL2l0c2VhX3Njb3JlZF8yMDIwMTAwMS5jc3YiKQpkZW1vZ3JhcGhpY3NfZmlsZSA8LSBwYXN0ZTAoaG9tZSwgImRlbW9ncmFwaGljcy9kZW1vXzZtb19jbGVhbmVkX2ZpbmFsLmNzdiIpCmxlbmFfZmlsZSA8LSBwYXN0ZTAoaG9tZSwgIkxFTkEvbGVuYV9maW5hbF93Zl9kYXkxXzIwMjAwMjA4X3VwdG85bW9udGhzLmNzdiIpCmlicV9maWxlIDwtIHBhc3RlMChob21lLCAiSUJRL2licV9zY29yZWRfZmluYWwuY3N2IikKc2ZwX2NhcmVfZmlsZSA8LSBwYXN0ZTAoaG9tZSwgImxhYl9jYXJlZ2l2aW5nX2JlaGF2aW9yL1BDSVJTX3NmcF93Zl9jb21wbGV0ZS5jc3YiKQpmcF9jYXJlX2ZpbGUgPC0gcGFzdGUwKGhvbWUsICJsYWJfY2FyZWdpdmluZ19iZWhhdmlvci9mcmVlX3BsYXlfd2ZfOG1pbl8yMDIwMDUwNy5jc3YiKQpjZXNkX2ZpbGUgPC0gcGFzdGUwKGhvbWUsICJDRVNEL2Nlc2Rfd2ZfMjAyMDEwMDEuY3N2IikKCiMgRnVuY3Rpb25zCnNvdXJjZSgiaWRlbnRpZnlfb3V0bGllcnNfaGlzdG9ncmFtLlIiKQoKdGhlbWVfbGVuYSA8LQogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIGhqdXN0ID0gLjUpLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIKICApCgojIERpc3BsYXkgb3B0aW9ucwpvcHRpb25zKHNjaXBlbiA9IDk5OSkKYGBgCgoKIyBSZWFkIGluIGFuZCBqb2luIGRhdGEKYGBge3J9CmQwIDwtCiAgcmVhZHhsOjpyZWFkX3hsc3goZWxpZ2libGVfaWRfZmlsZSwgc2hlZXQgPSAiZGF0YV9maWx0ZXJlZF9UMyIpICU+JSAKICBkcGx5cjo6c2VsZWN0KAogICAgSUQsCiAgICBlbGlnaWJsZSwKICAgIGluY2x1ZGVkCiAgKSAlPiUgCiAgZmlsdGVyKGluY2x1ZGVkID09IDEpICU+JSAKICBsZWZ0X2pvaW4oCiAgICByZWFkX2NzdihsZW5hX2VkaXRlZF9maWxlKSAlPiUgCiAgICAgIGRwbHlyOjpzZWxlY3QoCiAgICAgICAgSUQsIExFTkFfZWRpdGVkCiAgICAgICksCiAgICBieSA9ICJJRCIKICApICU+JSAKICBsZWZ0X2pvaW4oCiAgICByZWFkX2NzdihkZW1vZ3JhcGhpY3NfZmlsZSkgJT4lIAogICAgICBkcGx5cjo6c2VsZWN0KAogICAgICAgIElELAogICAgICAgIGJhYnlfZG9iLAogICAgICAgIGVkdWNhdGlvbiwKICAgICAgICBlZHVjYXRpb25fdHh0LAogICAgICAgIGFubnVhbF9pbmNvbWVfdHh0LAogICAgICAgIGluY29tZV9uZWVkcywKICAgICAgICBtYWxlLAogICAgICAgIG1vbV9hZ2UsCiAgICAgICAgbW9tX2xhdGlueCwKICAgICAgICBtb21fcmFjZSwKICAgICAgICBhZ2VfYmVoYXYsCiAgICAgICAgc2Vjb25kbGFuZywKICAgICAgICBzZWNvbmRsYW5nX3R5cGUKICAgICAgKSwKICAgIGJ5ID0gIklEIgogICkgJT4lIAogIGxlZnRfam9pbigKICAgIHJlYWRfY3N2KGl0c2VhX2ZpbGUpICU+JSAKICAgICAgZHBseXI6OnNlbGVjdCgKICAgICAgICBJRCwKICAgICAgICBzdXJ2ZXlfZGF0ZSwKICAgICAgICBpdHNlYV9zeW1wdG9tcywKICAgICAgICBpdHNlYV9hY3Rpdml0eSwKICAgICAgICBpdHNlYV9hZ3Jlc3MsCiAgICAgICAgaXRzZWFfZ2FkLAogICAgICAgIGl0c2VhX25lZ2VtbywKICAgICAgICBpdHNlYV9kZXBwLAogICAgICAgIGl0c2VhX2ludGVybiwKICAgICAgICBpdHNlYV9leHRlcm4sCiAgICAgICAgIyBpdHNlYSBzeW1wdG9tcyBpdGVtcwogICAgICAgIGl0c2VhX2EyLCAKICAgICAgICBpdHNlYV9hNCwgCiAgICAgICAgaXRzZWFfYjgsIAogICAgICAgIGl0c2VhX2IxMCwgCiAgICAgICAgaXRzZWFfYjI3LCAKICAgICAgICBpdHNlYV9iMzIsCiAgICAgICAgaXRzZWFfYTI4LCAKICAgICAgICBpdHNlYV9hMzAsIAogICAgICAgIGl0c2VhX2EzMywgCiAgICAgICAgaXRzZWFfYjMsIAogICAgICAgIGl0c2VhX2I5LCAKICAgICAgICBpdHNlYV9iMTYsIAogICAgICAgIGl0c2VhX2IzMCwgCiAgICAgICAgaXRzZWFfYjM0LCAKICAgICAgICBpdHNlYV9iNDQsIAogICAgICAgIGl0c2VhX2I4OCwgCiAgICAgICAgaXRzZWFfYzIsIAogICAgICAgIGl0c2VhX2U0LAogICAgICAgIGl0c2VhX2E5LCAKICAgICAgICBpdHNlYV9hMzksIAogICAgICAgIGl0c2VhX2E0MCwgCiAgICAgICAgaXRzZWFfYjQzLCAKICAgICAgICBpdHNlYV9iNzYsIAogICAgICAgIGl0c2VhX2I4MSwgCiAgICAgICAgaXRzZWFfYjg0LCAKICAgICAgICBpdHNlYV9iOTEsIAogICAgICAgIGl0c2VhX2I5MiwKICAgICAgICBpdHNlYV9hMywgCiAgICAgICAgaXRzZWFfYTEyLCAKICAgICAgICBpdHNlYV9hMzUsIAogICAgICAgIGl0c2VhX2IzNywgCiAgICAgICAgaXRzZWFfYjcwLCAKICAgICAgICBpdHNlYV9iODYsIAogICAgICAgIGl0c2VhX2U1LCAKICAgICAgICBpdHNlYV9lNiwgCiAgICAgICAgaXRzZWFfZTExLAogICAgICAgIGl0c2VhX2E3LCAKICAgICAgICBpdHNlYV9hMjEsIAogICAgICAgIGl0c2VhX2EyMywgCiAgICAgICAgaXRzZWFfYjMxLCAKICAgICAgICBpdHNlYV9iNDUsIAogICAgICAgIGl0c2VhX2I1MCwgCiAgICAgICAgaXRzZWFfYjUzLCAKICAgICAgICBpdHNlYV9iNTksIAogICAgICAgIGl0c2VhX2I2NSwgCiAgICAgICAgaXRzZWFfYjY2LCAKICAgICAgICBpdHNlYV9iNzQsIAogICAgICAgIGl0c2VhX2I4MCwgCiAgICAgICAgaXRzZWFfYjg1LAogICAgICAgIGl0c2VhX2NvbmNlcm5faWVkCiAgICAgICksIAogICAgYnkgPSAiSUQiCiAgKSAlPiUgCiAgbXV0YXRlKAogICAgc3VydmV5X2RhdGUgPSAgcGFyc2VfZGF0ZV90aW1lKHN1cnZleV9kYXRlLCBvcmRlcnMgPSBjKCJtZHkgSE0iKSksCiAgICBhZ2VfMThtbyA9IChiYWJ5X2RvYiAlLS0lIHN1cnZleV9kYXRlKSAvIG1vbnRocygxKQogICkgJT4lIAogIGxlZnRfam9pbigKICAgIHJlYWRfY3N2KGZwX2NhcmVfZmlsZSkgJT4lIAogICAgICBkcGx5cjo6c2VsZWN0KElELCBuZWdtb29kX0ZQLCBzZW5zX0ZQKSwKICAgIGJ5ID0gIklEIgogICkgJT4lIAogIGxlZnRfam9pbigKICAgIHJlYWRfY3N2KHNmcF9jYXJlX2ZpbGUpICU+JSAKICAgICAgZHBseXI6OnNlbGVjdChJRCwgc2Vuc19SX00sIHNlbnNfTSksCiAgICBieSA9ICJJRCIKICApICU+JSAKICBsZWZ0X2pvaW4oCiAgICByZWFkX2NzdihpYnFfZmlsZSkgJT4lIAogICAgICBkcGx5cjo6c2VsZWN0KAogICAgICAgIElELAogICAgICAgICNJQlEgTkVHIGl0ZW1zCiAgICAgICAgaWJxXzY0LCBpYnFfNzQsIGlicV83NSwgaWJxXzMyLCBpYnFfNzksIGlicV84MCwKICAgICAgICBpYnFfMiwgaWJxXzNfciwgaWJxXzQsIGlicV8yMSwgaWJxXzUyLCBpYnFfNTMsIGlicV82MiwKICAgICAgICBpYnFfMjIsIGlicV83NiwgaWJxXzc3LCBpYnFfNzgsIGlicV84NywgaWJxXzg5LAogICAgICAgIGlicV8zNiwgaWJxXzM3LCBpYnFfMzgsIGlicV82MywgaWJxXzcxLCBpYnFfNzIsCiAgICAgICAgTkVHCiAgICAgICksCiAgICBieSA9ICJJRCIKICApICU+JSAKICBsZWZ0X2pvaW4ocmVhZF9jc3YobGVuYV9maWxlKSwgYnkgPSAiSUQiKSAlPiUgCiAgbGVmdF9qb2luKHJlYWRfY3N2KGNlc2RfZmlsZSksIGJ5ID0gIklEIikgJT4lIAogIGxlZnRfam9pbihyZWFkX2NzdihmcF9pbnRlcnZlbnRpb25faWQpLCBieSA9ICJJRCIpICU+JSAKICByZW5hbWUoCiAgICBhZ2VfbGVuYV9kMSA9IGFnZSwKICAgIHNlbnNfcl9zZnAgPSBzZW5zX1JfTSwKICAgIHNlbnNfc2ZwID0gc2Vuc19NLAogICAgc2Vuc19mcCA9IHNlbnNfRlAsCiAgICBuZWdtb29kX2ZwID0gbmVnbW9vZF9GUAogICkgCmBgYAoKIyBSZXRlbnRpb24gLyBNaXNzaW5nIGRhdGEKCkR5YWRzIHdobyBjb21wbGV0ZWQgdGhlIDYtbW9udGggYXNzZXNzbWVudCAoZWl0aGVyIGxhYiBvciBob21lIG9ic2VydmF0aW9uKSwgd2VyZSBlbGlnaWJsZSBmb3IgdGhlIDE4LW1vbnRoIGFzc2Vzc21lbnQgKGkuZS4sIHdlcmUgYWdlIDE4IG1vbnRocyBieSB0aGUgdGltZSBvZiBhbmFseXNpcyksIGFuZCBjb21wbGV0ZWQgdGhlIDE4LW1vbnRoIGFzc2Vzc21lbnQgYXJlIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IGFuYWx5c2VzLiAKCmBgYHtyfQojbWlzc2luZyBTRlAKZDAgJT4lIAogIGNvdW50KGlzLm5hKHNlbnNfc2ZwKSkKCiNtaXNzaW5nIEZQCmQwICU+JSAKICBjb3VudChpcy5uYShzZW5zX2ZwKSkKCiNtaXNzaW5nIElCUQpkMCAlPiUgCiAgY291bnQoaXMubmEoTkVHKSkKCmQwICU+JSAKICBkcGx5cjo6c2VsZWN0KAogICAgYXdjX3Byb3AsIAogICAgY3RjX3Byb3AsCiAgICBhd2NfaG91cl9tYXgsCiAgICBjdGNfaG91cl9tYXgsCiAgICBzZW5zX3Jfc2ZwLAogICAgc2Vuc19mcCwKICAgIE5FRywKICApICU+JSAKICBwYWlyX24oKQpgYGAKCiMgRGVzY3JpcHRpdmUgc3RhdGlzdGljcyAKCiMjIElCUSwgSVRTRUEgcmVsaWFiaWxpdHkKCmBgYHtyfQpkMCAlPiUgCiAgZHBseXI6OnNlbGVjdChpYnFfNjQ6aWJxXzcyKSAlPiUgCiAgcHN5Y2g6OmFscGhhKGNoZWNrLmtleXMgPSBUUlVFKQpgYGAKCmBgYHtyfQpkMCAlPiUgCiAgZHBseXI6OnNlbGVjdChpdHNlYV9hMjppdHNlYV9iODUsIC1pdHNlYV9jMikgJT4lIAogIHBzeWNoOjphbHBoYSgpCmBgYAoKYGBge3J9CmQwICU+JSAKICBzdW1tYXJpemVfYXQoCiAgICB2YXJzKAogICAgICBhZ2VfMThtbywKICAgICAgYWdlX2xlbmFfZDEsCiAgICAgIE5FRywKICAgICAgZHVyYXRpb25fdG90YWwsCiAgICAgIGR1cmF0aW9uX2FuYWx5emVkLAogICAgICBjdF9maXJzdF90aW1lLAogICAgICBjdF9sYXN0X3RpbWUsCiAgICAgIGN2Y19ob3VyX21heCwKICAgICAgY3RjX2hvdXJfbWF4LAogICAgICBhd2NfaG91cl9tYXgsCiAgICAgIGN0Y19wcm9wLAogICAgICBhd2NfcHJvcCwKICAgICAgc2Vuc19yX3NmcCwKICAgICAgc2Vuc19mcCwKICAgICAgbmVnbW9vZF9mcCwKICAgICAgaXRzZWFfc3ltcHRvbXMsCiAgICAgIG1vbV9hZ2UsCiAgICAgIGluY29tZV9uZWVkcywKICAgICAgcGVyY2VudF9tb3RoZXIsCiAgICAgIGNlc2RfdDMsCiAgICAgIGNlc2RfdDQKICAgICksIAogICAgZnVucyhtZWFuLCBzZCwgbWluLCBtYXgpLCBuYS5ybSA9IFRSVUUKICApCgpgYGAKYGBge3J9CmQwICU+JSAKICBjb3VudChtYWxlKSAlPiUgCiAgbXV0YXRlKAogICAgcGVyID0gbiAvIHN1bShuKQogICkKCmQwICU+JSAKICBjb3VudChpdHNlYV9jb25jZXJuX2llZCkgJT4lIAogIG11dGF0ZSgKICAgIHBlciA9IG4gLyBzdW0obikKICApCgpkMCAlPiUgCiAgY291bnQoaW5jb21lX25lZWRzIDwgMSkgJT4lIAogIG11dGF0ZSgKICAgIHBlciA9IG4gLyBzdW0obikKICApCgpkMCAlPiUgCiAgY291bnQobW9tX2xhdGlueCkgJT4lIAogIG11dGF0ZSgKICAgIHBlciA9IG4gLyBzdW0obikKICApCgpkMCAlPiUgCiAgY291bnQobW9tX3JhY2UpICU+JSAKICBtdXRhdGUoCiAgICBwZXIgPSBuIC8gc3VtKG4pCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKQoKZDAgJT4lIAogIGNvdW50KGVkdWNhdGlvbl90eHQpICU+JSAKICBtdXRhdGUoCiAgICBwZXIgPSBuIC8gc3VtKG4pCiAgKSAlPiUgCiAgYXJyYW5nZShlZHVjYXRpb25fdHh0KQoKZDAgJT4lIAogIGNvdW50KGRheV90eXBlKSAlPiUgCiAgbXV0YXRlKHBlciA9IG4gLyBzdW0obikpCgpkMCAlPiUgCiAgY291bnQoY2VzZF90MyA+PSAxNikgJT4lIAogIG11dGF0ZShwZXIgPSBuIC8gc3VtKG4pKQoKZDAgJT4lIAogIGNvdW50KGNlc2RfdDQgPj0gMTYpICU+JSAKICBtdXRhdGUocGVyID0gbiAvIHN1bShuKSkKCmBgYAoKYGBge3J9CmQwICU+JSAKICBjb3VudChsZW5hX21vcm5zdGFydCwgbGVuYV9yZWNvcmRmdWxsKQoKZDAgJT4lIAogIGZpbHRlcihsZW5hX21vcm5zdGFydCA9PSAwKSAlPiUgCiAgZHBseXI6OnNlbGVjdCgKICAgIElELCAKICAgIGxlbmFfcmVjb3Jkbm8sIAogICAgY3RfZmlyc3RfdGltZSwgCiAgICBjdF9sYXN0X3RpbWUsIAogICAgZHVyYXRpb25fdG90YWwsIAogICAgZHVyYXRpb25fYW5hbHl6ZWQsIAogICAgbGVuYV9ub3RlcwogICkKYGBgCgojIyBEaXN0cmlidXRpb25zIAoKYGBge3J9CmQwICU+JSAKICBpZGVudGlmeV9vdXRsaWVyc19oaXN0KHggPSBjdmNfaG91cl9tYXgpCgpkMCAlPiUgCiAgaWRlbnRpZnlfb3V0bGllcnNfaGlzdCh4ID0gY3RjX2hvdXJfbWF4KQoKZDAgJT4lIAogIGlkZW50aWZ5X291dGxpZXJzX2hpc3QoeCA9IGN0Y19wcm9wKQoKZDAgJT4lIAogIGlkZW50aWZ5X291dGxpZXJzX2hpc3QoeCA9IGF3Y19ob3VyX21heCkKCmQwICU+JSAKICBpZGVudGlmeV9vdXRsaWVyc19oaXN0KHggPSBhd2NfcHJvcCkKCmQwICU+JSAKICBpZGVudGlmeV9vdXRsaWVyc19oaXN0KHggPSBzZW5zX3Jfc2ZwKQoKZDAgJT4lIAogIGlkZW50aWZ5X291dGxpZXJzX2hpc3QoeCA9IHNlbnNfZnApCgpkMCAlPiUgCiAgaWRlbnRpZnlfb3V0bGllcnNfaGlzdCh4ID0gaXRzZWFfc3ltcHRvbXMpCgpkMCAlPiUgCiAgaWRlbnRpZnlfb3V0bGllcnNfaGlzdCh4ID0gY2VzZF90MykKCmQwICU+JSAKICBpZGVudGlmeV9vdXRsaWVyc19oaXN0KHggPSBjZXNkX3Q0KQoKCmQwICU+JSAKICBnZ3Bsb3QoYWVzKHBlcmNlbnRfbW90aGVyKSkgKwogIGdlb21faGlzdG9ncmFtKCkgKwogIHRoZW1lX2xlbmEgKwogIGxhYnMoCiAgICB4ID0gIiUgb2YgdGhlIExFTkEgcmVjb3JkaW5nIGRheSBpbmZhbnQgd2l0aCBtb3RoZXIiCiAgKQoKZ2dzYXZlKAogICJ+L0JveC9sdWN5X2tpbmdfZmlsZXMvQkFCSUVTL2xlbmFfc3ltcHRvbXMvbWFudXNjcmlwdC9wZXJjZW50X21vbV9oaXN0LnBuZyIsCiAgd2lkdGggPSA3LAogIGhlaWdodCA9IDUKKQpgYGAKCgojIyBDb3JyZWxhdGlvbnMKCmBgYCB7cn0KY29ycl9sZW5hIDwtIAogIGQwICU+JQogIGRwbHlyOjpzZWxlY3QoCiAgICBgQVcgY29uc2lzdGVuY3lgID0gYXdjX3Byb3AsCiAgICBgQ1QgY29uc2lzdGVuY3lgID0gY3RjX3Byb3AsCiAgICBgQVcgcXVhbnRpdHlgID0gYXdjX2hvdXJfbWF4LAogICAgYENUIHF1YW50aXR5YCA9IGN0Y19ob3VyX21heCwKICAgIGBJbmZhbnQgdm9jYWxpemF0aW9uc2AgPSBjdmNfaG91cl9tYXgsCiAgICBgU2Vuc2l0aXZpdHkgdG8gZGlzdHJlc3NgID0gc2Vuc19yX3NmcCwKICAgIGBTZW5zaXRpdml0eSBkdXJpbmcgcGxheWAgPSBzZW5zX2ZwLAogICkgJT4lIAogIGNvcnJlbGF0ZSh1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIiwgbWV0aG9kID0gInBlYXJzb24iKSAlPiUgCiAgc2hhdmUodXBwZXIgPSBUUlVFKSAlPiUgCiAgZmFzaGlvbigpICAKYGBgCgpgYGB7cn0KY29ycl9sZW5hX3Bsb3QgPC0KICBjb3JyX2xlbmEgJT4lIAogIGdhdGhlcih2YXJpYWJsZSwgdmFsdWUsIC1yb3duYW1lKSAlPiUgCiAgbXV0YXRlKAogICAgdmFyaWFibGUgPSBzdHJfcmVwbGFjZV9hbGwodmFyaWFibGUsICJcXC4iLCAiICIpLAogICAgcm93bmFtZSA9IGFzLmNoYXJhY3Rlcihyb3duYW1lKSwKICAgIHZhbHVlX2NociA9IGFzLmNoYXJhY3Rlcih2YWx1ZSksCiAgICB2YWx1ZV9jaHIgPSBjYXNlX3doZW4oCiAgICAgIHJvd25hbWUgPT0gIkNUIGNvbnNpc3RlbmN5IiAmIHZhcmlhYmxlID09ICJBVyBxdWFudGl0eSIgfiAiLjIzIiwKICAgICAgcm93bmFtZSA9PSAiQVcgcXVhbnRpdHkiICYgdmFyaWFibGUgPT0gIkNUIGNvbnNpc3RlbmN5IiB+IE5BX2NoYXJhY3Rlcl8sCiAgICAgIHJvd25hbWUgPT0gIlNlbnNpdGl2aXR5IHRvIGRpc3RyZXNzIiAmIHZhcmlhYmxlID09ICJTZW5zaXRpdml0eSBkdXJpbmcgcGxheSIgfiAiLjEwIiwKICAgICAgcm93bmFtZSA9PSAiU2Vuc2l0aXZpdHkgZHVyaW5nIHBsYXkiICYgdmFyaWFibGUgPT0gIlNlbnNpdGl2aXR5IHRvIGRpc3RyZXNzIiB+IE5BX2NoYXJhY3Rlcl8sCiAgICAgIFRSVUUgfiB2YWx1ZV9jaHIKICAgICksCiAgICB2YWx1ZV9udW0gPSBhcy5udW1lcmljKHZhbHVlX2NocikKICApIApgYGAKCmBgYHtyfQpjb3JyX2xlbmFfcGxvdCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcm93bmFtZSwgeSA9IHZhcmlhYmxlKSkgKwogIGdlb21fdGlsZShhZXMoZmlsbCA9IGFicyh2YWx1ZV9udW0pKSkgKwogIGdlb21fdGV4dCgKICAgIGFlcyhsYWJlbCA9IHZhbHVlX2NociksIAogICAgc2l6ZSA9IDQKICApICsKICBzY2FsZV9maWxsX2dyYWRpZW50MigKICAgIGxvdyA9ICJibHVlIiwKICAgIGhpZ2ggPSAicmVkIiwKICAgIG1pZCA9ICJ3aGl0ZSIsCiAgICBuYS52YWx1ZSA9ICJ3aGl0ZSIsCiAgICBtaWRwb2ludCA9IDAsCiAgICBsaW1pdCA9IGMoLTEsIDEpLAogICAgc3BhY2UgPSAiTGFiIiwKICAgIG5hbWUgPSAiUGVhcnNvbiBjb3JyZWxhdGlvblxuY29lZmZpY2llbnQiCiAgKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LAogICAgICBoanVzdCA9IDEsCiAgICAgIHZqdXN0ID0gMSwKICAgICAgc2l6ZSA9IDEyCiAgICApLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSAxMiwKICAgICAgaGp1c3QgPSAxLjEKICAgICkKICApIAoKZ2dzYXZlKAogICJ+L0JveC9sdWN5X2tpbmdfZmlsZXMvQkFCSUVTL2xlbmFfc3ltcHRvbXMvbWFudXNjcmlwdC9kZXZfc2NpZW5jZS9wbG90cy9sZW5hX2NvcnJfcGxvdC5lcHMiLCAKICBkcGkgPSAxMDAwLAogIGhlaWdodCA9IDUsIAogIHdpZHRoID0gNwopCmBgYAoKYGBge3J9CmNvci50ZXN0KGQwJGNlc2RfdDMsIGQwJGF3Y19ob3VyX21heCkKY29yLnRlc3QoZDAkY2VzZF90MywgZDAkYXdjX3Byb3ApCmNvci50ZXN0KGQwJGNlc2RfdDMsIGQwJGN0Y19ob3VyX21heCkKY29yLnRlc3QoZDAkY2VzZF90MywgZDAkY3RjX3Byb3ApCmNvci50ZXN0KGQwJGNlc2RfdDMsIGQwJGN2Y19ob3VyX21heCkKY29yLnRlc3QoZDAkY2VzZF90MywgZDAkc2Vuc19yX3NmcCkKY29yLnRlc3QoZDAkY2VzZF90MywgZDAkc2Vuc19mcCkKCmNvci50ZXN0KGQwJE5FRywgZDAkYXdjX2hvdXJfbWF4KQpjb3IudGVzdChkMCRORUcsIGQwJGF3Y19wcm9wKQpjb3IudGVzdChkMCRORUcsIGQwJGN0Y19ob3VyX21heCkKY29yLnRlc3QoZDAkTkVHLCBkMCRjdGNfcHJvcCkKY29yLnRlc3QoZDAkTkVHLCBkMCRjdmNfaG91cl9tYXgpCmNvci50ZXN0KGQwJE5FRywgZDAkc2Vuc19yX3NmcCkKY29yLnRlc3QoZDAkTkVHLCBkMCRzZW5zX2ZwKQpgYGAKCmBgYHtyfQpjb3IudGVzdChkMCRhd2NfaG91cl9tYXgsIGQwJHNlbnNfZnApCmNvci50ZXN0KGQwJGF3Y19ob3VyX21heCwgZDAkc2Vuc19yX3NmcCkKCmNvci50ZXN0KGQwJGN0Y19ob3VyX21heCwgZDAkc2Vuc19mcCkKY29yLnRlc3QoZDAkY3RjX2hvdXJfbWF4LCBkMCRzZW5zX3Jfc2ZwKQoKY29yLnRlc3QoZDAkYXdjX3Byb3AsIGQwJHNlbnNfZnApCmNvci50ZXN0KGQwJGF3Y19wcm9wLCBkMCRzZW5zX3Jfc2ZwKQoKY29yLnRlc3QoZDAkY3RjX3Byb3AsIGQwJHNlbnNfZnApCmNvci50ZXN0KGQwJGN0Y19wcm9wLCBkMCRzZW5zX3Jfc2ZwKQoKY29yLnRlc3QoZDAkY3ZjX2hvdXJfbWF4LCBkMCRzZW5zX2ZwKQpjb3IudGVzdChkMCRjdmNfaG91cl9tYXgsIGQwJHNlbnNfcl9zZnApCgpjb3IudGVzdChkMCRzZW5zX2ZwLCBkMCRzZW5zX3Jfc2ZwKQpgYGAKCiMjIHQtdGVzdHMgYnkgYmlsaW5ndWFsIHN0YXR1cwpgYGB7cn0KdC50ZXN0KGQwJGF3Y19ob3VyX21heCB+IGQwJHNlY29uZGxhbmcpCgp0LnRlc3QoZDAkY3RjX2hvdXJfbWF4IH4gZDAkc2Vjb25kbGFuZykKCnQudGVzdChkMCRjdGNfcHJvcCB+IGQwJHNlY29uZGxhbmcpCgp0LnRlc3QoZDAkYXdjX3Byb3AgfiBkMCRzZWNvbmRsYW5nKQoKdC50ZXN0KGQwJGl0c2VhX3N5bXB0b21zIH4gZDAkc2Vjb25kbGFuZykKYGBgCgojIyB0LXRlc3RzIGJ5IGRheSB0eXBlCmBgYHtyfQp0LnRlc3QoZDAkYXdjX2hvdXJfbWF4IH4gZDAkZGF5X3R5cGUpCgp0LnRlc3QoZDAkY3RjX2hvdXJfbWF4IH4gZDAkZGF5X3R5cGUpCgp0LnRlc3QoZDAkY3RjX3Byb3AgfiBkMCRkYXlfdHlwZSkKCnQudGVzdChkMCRhd2NfcHJvcCB+IGQwJGRheV90eXBlKQpgYGAKCgojIyBIaXN0b2dyYW1zCmBgYHtyfQpkMCAlPiUgCiAgZHBseXI6OnNlbGVjdCgKICAgIGN0Y19ob3VyX21heCwKICAgIGF3Y19ob3VyX21heCwKICAgIGN0Y19wcm9wLAogICAgYXdjX3Byb3AsCiAgICBzZW5zX2ZwLAogICAgc2Vuc19yX3NmcAogICkgJT4lIAogIGdhdGhlcihtZWFzdXJlLCB2YWx1ZSwgY3RjX2hvdXJfbWF4OnNlbnNfcl9zZnApICU+JSAKICBtdXRhdGUoCiAgICBtZWFzdXJlID0gZmFjdG9yKAogICAgICBtZWFzdXJlLAogICAgICBsZXZlbHMgPSBjKAogICAgICAgICJhd2NfcHJvcCIsCiAgICAgICAgImN0Y19wcm9wIiwKICAgICAgICAiYXdjX2hvdXJfbWF4IiwKICAgICAgICAiY3RjX2hvdXJfbWF4IiwKICAgICAgICAic2Vuc19yX3NmcCIsCiAgICAgICAgInNlbnNfZnAiCiAgICAgICksCiAgICAgIGxhYmVscyA9IGMoCiAgICAgICAgIkFXIGNvbnNpc3RlbmN5IiwgCiAgICAgICAgIkNUIGNvbnNpc3RlbmN5IiwgCiAgICAgICAgIkFXIHF1YW50aXR5IiwgCiAgICAgICAgIkNUIHF1YW50aXR5IiwKICAgICAgICAiU2Vuc2l0aXZpdHkgdG8gZGlzdHJlc3MiLAogICAgICAgICJTZW5zaXZpdHkgZHVyaW5nIHBsYXkiCiAgICAgICAgKQogICAgKQogICkgJT4lIAogIGdncGxvdChhZXModmFsdWUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oKSArCiAgZmFjZXRfd3JhcCgufm1lYXN1cmUsIHNjYWxlcyA9ICJmcmVlIiwgbmNvbCA9IDIsIG5yb3cgPSAzKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgaGp1c3QgPSAuNSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIgogICkgKwogIGxhYnMoCiAgICB4ID0gIkNhcmVnaXZpbmcgaW5wdXQgdmFsdWUiCiAgKQoKCmdnc2F2ZSgKICAifi9Cb3gvbHVjeV9raW5nX2ZpbGVzL0JBQklFUy9sZW5hX3N5bXB0b21zL21hbnVzY3JpcHQvZGV2X3NjaWVuY2UvcGxvdHMvY2FyZV9oaXN0X2dncGFuZWxzLnBuZyIsCiAgd2lkdGggPSA3LjUsCiAgaGVpZ2h0ID0gOAopCmBgYAoKYGBge3J9CmQwICU+JSAKICBnZ3Bsb3QoYWVzKGl0c2VhX3N5bXB0b21zKSkgKwogIGdlb21faGlzdG9ncmFtKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEuaW50KDAsIDMsIC4yNSkpICsKICB0aGVtZV9sZW5hICsKICBsYWJzKAogICAgeCA9ICJUb2RkbGVyIHN5bXB0b21zIG9mIHBzeWNob3BhdGhvbG9neSIKICApCgpnZ3NhdmUoCiAgIn4vQm94L2x1Y3lfa2luZ19maWxlcy9CQUJJRVMvbGVuYV9zeW1wdG9tcy9tYW51c2NyaXB0L2Rldl9zY2llbmNlL3Bsb3RzL2l0c2VhX2hpc3QucG5nIgopCmBgYAoKYGBge3J9CmQwICU+JSAKICBkcGx5cjo6c2VsZWN0KAogICAgQWN0aXZpdHkgPSBpdHNlYV9hY3Rpdml0eSwKICAgIEFnZ3Jlc3Npb24gPSBpdHNlYV9hZ3Jlc3MsCiAgICBEZXByZXNzaW9uID0gaXRzZWFfZGVwcCwKICAgIEFueGlldHkgPSBpdHNlYV9nYWQsCiAgICBgTmVnYXRpdmUgZW1vdGlvbmAgPSBpdHNlYV9uZWdlbW8KICApICU+JSAKICBnYXRoZXIoaXRzZWFfc3Vic2NhbGUsIHNjb3JlLCBBY3Rpdml0eTpgTmVnYXRpdmUgZW1vdGlvbmApICU+JSAKICBnZ3Bsb3QoYWVzKHNjb3JlKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMikgKwogIHRoZW1lX2xlbmEgKwogIHRoZW1lKAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpCiAgKSArCiAgZmFjZXRfd3JhcCgufml0c2VhX3N1YnNjYWxlLCBzY2FsZXMgPSAiZnJlZSIpICsKICBsYWJzKAogICAgeCA9ICJTdWJzY2FsZSBzY29yZSIKICApCgpnZ3NhdmUoCiAgIn4vQm94L2x1Y3lfa2luZ19maWxlcy9CQUJJRVMvbGVuYV9zeW1wdG9tcy9tYW51c2NyaXB0L2Rldl9zY2llbmNlL3Bsb3RzL2l0c2VhX3N1YnNjYWxlX2hpc3QucG5nIiwKICB3aWR0aCA9IDEwLAogIGhlaWdodCA9IDcKKQpgYGAKCmBgYHtyfQpkMCAlPiUgCiAgZ2dwbG90KGFlcyhjZXNkX3QzKSkgKwogIGdlb21faGlzdG9ncmFtKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEuaW50KDAsIDUwLCA1KSkgKwogIHRoZW1lX2xlbmEgKwogIGxhYnMoCiAgICB4ID0gIk1hdGVybmFsIGRlcHJlc3NpdmUgc3ltcHRvbXNcbiBhdCBpbmZhbnQgYWdlIDYgbW9udGhzIgogICkKCmdnc2F2ZSgKICAifi9Cb3gvbHVjeV9raW5nX2ZpbGVzL0JBQklFUy9sZW5hX3N5bXB0b21zL21hbnVzY3JpcHQvZGV2X3NjaWVuY2UvcGxvdHMvY2VzZDZfaGlzdC5wbmciCikKYGBgCgpgYGB7cn0KZDAgJT4lIAogIGdncGxvdChhZXMoY2VzZF90NCkpICsKICBnZW9tX2hpc3RvZ3JhbSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxLmludCgwLCA1MCwgNSkpICsKICB0aGVtZV9sZW5hICsKICBsYWJzKAogICAgeCA9ICJNYXRlcm5hbCBkZXByZXNzaXZlIHN5bXB0b21zXG4gYXQgaW5mYW50IGFnZSAxOCBtb250aHMiCiAgKQoKZ2dzYXZlKAogICJ+L0JveC9sdWN5X2tpbmdfZmlsZXMvQkFCSUVTL2xlbmFfc3ltcHRvbXMvbWFudXNjcmlwdC9kZXZfc2NpZW5jZS9wbG90cy9jZXNkMThfaGlzdC5wbmciCikKYGBgCgojIFJlc3VsdHMgCgojIyBBc3NvY2lhdGlvbnMgb2YgTEVOQSBtZWFzdXJlcyB3aXRoIElUU0VBIHN5bXB0b21zIAoKIyMjIEVmZmVjdCBjb2RlIGNhdGVnb3JpY2FsIHZhcmlhYmxlcwoKYGBge3J9CmQwIDwtCiAgZDAgJT4lIAogIG11dGF0ZSgKICAgIHdoaXRlID0gYXMuZmFjdG9yKAogICAgICBpZl9lbHNlKAogICAgICAgIG1vbV9yYWNlID09ICJXaGl0ZSIsIAogICAgICAgIDEsIDAKICAgICAgKQogICAgKSwKICAgIG1hbGUgPSBhcy5mYWN0b3IobWFsZSksCiAgICBtb21fbGF0aW54ID0gYXMuZmFjdG9yKG1vbV9sYXRpbngpCiAgKQoKY29udHJhc3RzKGQwJG1hbGUpIDwtIGMoLS41LCAuNSkKY29udHJhc3RzKGQwJHdoaXRlKSA8LSBjKC0uNSwgLjUpCmNvbnRyYXN0cyhkMCRtb21fbGF0aW54KSA8LSBjKC0uNSwgLjUpCmBgYAoKIyMjIEZvcm1hbCBtb2RlbCBmaXR0aW5nCmBgYHtyfQpkMF9sbSA8LQogIGQwICU+JSAKICBmaWx0ZXIoIWlzLm5hKE5FRykpCmBgYAoKCmBgYHtyfQptb2RfMCA8LQogIGxtKAogICAgc2NhbGUoaXRzZWFfc3ltcHRvbXMpIH4KICAgICAgMSwKICAgIGRhdGEgPSBkMF9sbQogICkKYGBgCgpgYGB7cn0KbW9kX2Nlc2R0MyA8LQogIGxtKAogICAgc2NhbGUoaXRzZWFfc3ltcHRvbXMpIH4KICAgICAgc2NhbGUoY2VzZF90MyksCiAgICBkYXRhID0gZDBfbG0KICApCgphbm92YShtb2RfMCwgbW9kX2Nlc2R0MykKYGBgCgpgYGB7cn0KbW9kX2Nlc2R0NCA8LQogIGxtKAogICAgc2NhbGUoaXRzZWFfc3ltcHRvbXMpIH4KICAgICAgc2NhbGUoY2VzZF90NCksCiAgICBkYXRhID0gZDBfbG0KICApCgphbm92YShtb2RfMCwgbW9kX2Nlc2R0NCkKYGBgCgpgYGB7cn0KbW9kX25lZyA8LQogIGxtKAogICAgc2NhbGUoaXRzZWFfc3ltcHRvbXMpIH4KICAgICAgc2NhbGUoY2VzZF90NCkgKwogICAgICBzY2FsZShORUcpLAogICAgZGF0YSA9IGQwX2xtCiAgKQoKYW5vdmEobW9kX2Nlc2R0NCwgbW9kX25lZykKbW9kZWxfcGFyYW1ldGVycyhtb2RfbmVnKQpjYWxjLnJlbGltcChtb2RfbmVnKQpgYGAKCmBgYHtyfQptb2RfQmFnZSA8LQogIGxtKAogICAgc2NhbGUoaXRzZWFfc3ltcHRvbXMpIH4KICAgICAgc2NhbGUoTkVHKSArCiAgICAgIHNjYWxlKGNlc2RfdDQpICsKICAgICAgc2NhbGUoYWdlX2xlbmFfZDEpLAogICAgZGF0YSA9IGQwX2xtCiAgKQoKYW5vdmEobW9kX25lZywgbW9kX0JhZ2UpCmBgYAoKYGBge3J9Cm1vZF9NYWdlIDwtCiAgbG0oCiAgICBzY2FsZShpdHNlYV9zeW1wdG9tcykgfgogICAgICBzY2FsZShORUcpICsKICAgICAgc2NhbGUoY2VzZF90NCkgKwogICAgICBzY2FsZShtb21fYWdlKSwKICAgIGRhdGEgPSBkMF9sbQogICkKCmFub3ZhKG1vZF9uZWcsIG1vZF9NYWdlKQpgYGAKCmBgYHtyfQptb2RfcmFjZSA8LQogIGxtKAogICAgc2NhbGUoaXRzZWFfc3ltcHRvbXMpIH4KICAgICAgc2NhbGUoTkVHKSArCiAgICAgIHNjYWxlKGNlc2RfdDQpICsKICAgICAgd2hpdGUsIAogICAgZGF0YSA9IGQwX2xtCiAgKQoKYW5vdmEobW9kX25lZywgbW9kX3JhY2UpCmBgYAoKYGBge3J9Cm1vZF9ldGhuaWNpdHkgPC0KICBsbSgKICAgIHNjYWxlKGl0c2VhX3N5bXB0b21zKSB+CiAgICAgIHNjYWxlKE5FRykgKwogICAgICBzY2FsZShjZXNkX3Q0KSArCiAgICAgIG1vbV9sYXRpbngsIAogICAgZGF0YSA9IGQwX2xtCiAgKQoKYW5vdmEobW9kX25lZywgbW9kX2V0aG5pY2l0eSkKYGBgCgpgYGB7cn0KbW9kX2VkdWNhdGlvbiA8LQogIGxtKAogICAgc2NhbGUoaXRzZWFfc3ltcHRvbXMpIH4KICAgICAgc2NhbGUoTkVHKSArCiAgICAgIHNjYWxlKGNlc2RfdDQpICsKICAgICAgc2NhbGUoZWR1Y2F0aW9uKSwKICAgIGRhdGEgPSBkMF9sbQogICkKCmFub3ZhKG1vZF9uZWcsIG1vZF9lZHVjYXRpb24pCmBgYAoKYGBge3J9Cm1vZF9pbmNvbWVfbmVlZHMgPC0KICBsbSgKICAgIHNjYWxlKGl0c2VhX3N5bXB0b21zKSB+CiAgICAgIHNjYWxlKE5FRykgKwogICAgICBzY2FsZShjZXNkX3Q0KSArCiAgICAgIHNjYWxlKGluY29tZV9uZWVkcyksIAogICAgZGF0YSA9IGQwX2xtCiAgKQoKYW5vdmEobW9kX25lZywgbW9kX2luY29tZV9uZWVkcykKYGBgCgoKYGBge3J9Cm1vZF9zZXggPC0KICBsbSgKICAgIHNjYWxlKGl0c2VhX3N5bXB0b21zKSB+CiAgICAgIHNjYWxlKE5FRykgKwogICAgICBzY2FsZShjZXNkX3Q0KSArCiAgICAgIG1hbGUsIAogICAgZGF0YSA9IGQwX2xtCiAgKQoKYW5vdmEobW9kX25lZywgbW9kX3NleCkKYGBgCgoKCiMjIyBDb25zaXN0ZW5jeQoKIyMjIyBBVwpgYGB7cn0KbW9kX2F3cHJvcCA8LQogIGxtKAogICAgc2NhbGUoaXRzZWFfc3ltcHRvbXMpIH4KICAgICAgc2NhbGUoTkVHKSArCiAgICAgIHNjYWxlKGNlc2RfdDQpICsKICAgICAgc2NhbGUoYXdjX3Byb3ApLAogICAgZGF0YSA9IGQwX2xtCiAgKQoKbW9kZWxfcGFyYW1ldGVycyhtb2RfYXdwcm9wKQpjYWxjLnJlbGltcChtb2RfYXdwcm9wKQpgYGAKCiMjIyMgQ1QKYGBge3J9Cm1vZF9jdHByb3AgPC0KICBsbSgKICAgIHNjYWxlKGl0c2VhX3N5bXB0b21zKSB+CiAgICAgIHNjYWxlKE5FRykgKwogICAgICBzY2FsZShjZXNkX3Q0KSArCiAgICAgIHNjYWxlKGN0Y19wcm9wKSwKICAgIGRhdGEgPSBkMF9sbQogICkKCm1vZGVsX3BhcmFtZXRlcnMobW9kX2N0cHJvcCkKY2FsYy5yZWxpbXAobW9kX2N0cHJvcCkKYGBgCgojIyMgUXVhbnRpdHkKCiMjIyMgQVcKYGBge3J9Cm1vZF9hd21heDwtCiAgbG0oCiAgICBzY2FsZShpdHNlYV9zeW1wdG9tcykgfgogICAgICBzY2FsZShORUcpICsKICAgICAgc2NhbGUoY2VzZF90NCkgKwogICAgICBzY2FsZShhd2NfaG91cl9tYXgpLAogICAgZGF0YSA9IGQwX2xtCiAgKQoKbW9kZWxfcGFyYW1ldGVycyhtb2RfYXdtYXgpCmNhbGMucmVsaW1wKG1vZF9hd21heCkKYGBgCiMjIyMgQ1QKYGBge3J9Cm1vZF9jdG1heCA8LQogIGxtKAogICAgc2NhbGUoaXRzZWFfc3ltcHRvbXMpIH4KICAgICAgc2NhbGUoTkVHKSArCiAgICAgIHNjYWxlKGNlc2RfdDQpICsKICAgICAgc2NhbGUoY3RjX2hvdXJfbWF4KSwKICAgIGRhdGEgPSBkMF9sbQogICkKCm1vZGVsX3BhcmFtZXRlcnMobW9kX2N0bWF4KQpjYWxjLnJlbGltcChtb2RfY3RtYXgpCmBgYAoKIyMjIEluZmFudCB2b2NhbGl6YXRpb25zCmBgYHtyfQptb2RfY3ZtYXggPC0KICBsbSgKICAgIHNjYWxlKGl0c2VhX3N5bXB0b21zKSB+CiAgICAgIHNjYWxlKE5FRykgKwogICAgICBzY2FsZShjZXNkX3Q0KSArCiAgICAgIHNjYWxlKGN2Y19ob3VyX21heCksCiAgICBkYXRhID0gZDBfbG0KICApCgptb2RlbF9wYXJhbWV0ZXJzKG1vZF9jdm1heCkKY2FsYy5yZWxpbXAobW9kX2N2bWF4KQpgYGAKCiMjIyBCYXllcyBGYWN0b3JzCmBgYHtyfQptb2RlbF9kIDwtCiAgZDBfbG0gJT4lIAogIGRwbHlyOjpzZWxlY3QoCiAgICBhd2NfcHJvcCwKICAgIGN0Y19wcm9wLAogICAgYXdjX2hvdXJfbWF4LAogICAgY3RjX2hvdXJfbWF4LAogICAgY3ZjX2hvdXJfbWF4LAogICAgaXRzZWFfc3ltcHRvbXMsCiAgICBORUcsCiAgICBjZXNkX3Q0CiAgKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpCgojIGVhY2ggbWVhc3VyZSBpcyBjb21wYXJlZCB0byBhIGNvdmFyaWF0ZSBvbmx5IG1vZGVsCmxtQkZfY292b25seSA9IGxtQkYoaXRzZWFfc3ltcHRvbXMgfiBORUcgKyBjZXNkX3Q0LCBkYXRhID0gbW9kZWxfZCkKCmxtQkZfYXdjcHJvcCA9IGxtQkYoaXRzZWFfc3ltcHRvbXMgfiBhd2NfcHJvcCArIGNlc2RfdDQgKyBORUcsIGRhdGEgPSBtb2RlbF9kKQpsbUJGX2N0Y3Byb3AgPSBsbUJGKGl0c2VhX3N5bXB0b21zIH4gY3RjX3Byb3AgKyBjZXNkX3Q0ICsgTkVHLCBkYXRhID0gbW9kZWxfZCkKCmxtQkZfYXdjbWF4ID0gbG1CRihpdHNlYV9zeW1wdG9tcyB+IGF3Y19ob3VyX21heCArIGNlc2RfdDQgKyBORUcsIGRhdGEgPSBtb2RlbF9kKQpsbUJGX2N0Y21heCA9IGxtQkYoaXRzZWFfc3ltcHRvbXMgfiBjdGNfaG91cl9tYXggKyBjZXNkX3Q0ICsgTkVHLCBkYXRhID0gbW9kZWxfZCkKCm1CRl9jdmNtYXggPSBsbUJGKGl0c2VhX3N5bXB0b21zIH4gY3ZjX2hvdXJfbWF4ICsgY2VzZF90NCArIE5FRywgZGF0YSA9IG1vZGVsX2QpCgojIEJGIGZvciBBVyBjb25zaXN0ZW5jeQpsbUJGX2F3Y3Byb3AgLyBsbUJGX2Nvdm9ubHkKCiMgQkYgZm9yIENUIGNvbnNpc3RlbmN5CmxtQkZfY3RjcHJvcCAvIGxtQkZfY292b25seQoKIyBCRiBmb3IgQVcgcXVhbnRpdHkKbG1CRl9hd2NtYXggLyBsbUJGX2Nvdm9ubHkKCiMgQkYgZm9yIENUIHF1YW50aXR5CmxtQkZfY3RjbWF4IC8gbG1CRl9jb3Zvbmx5CgojIEJGIGZvciBpbmZhbnQgdm9jYWxpemF0aW9ucwptQkZfY3ZjbWF4IC8gbG1CRl9jb3Zvbmx5CmBgYAoKIyMjIENyZWF0ZSByZXNpZHVhbGl6ZWQgc3ltcHRvbXMgdmFyaWFibGUgZm9yIGNvdmFyaWF0ZXMgaW4gYmVzdCBmaXR0aW5nIG1vZGVsCmBgYHtyfQpiZXN0X2NvdiA8LSBsbSgKICBpdHNlYV9zeW1wdG9tcyB+CiAgICBzY2FsZShjZXNkX3Q0LCBzY2FsZSA9IEZBTFNFKSArCiAgICBzY2FsZShORUcsIHNjYWxlID0gRkFMU0UpLAogIGRhdGEgPSBkMAopCgpkMCA8LQogIGQwICU+JSAKICBhZGRfcmVzaWR1YWxzKGJlc3RfY292LCB2YXIgPSAicmVzaWRfc3ltcHRvbXMiKQpgYGAKCiMjIFBsb3QgYXNzb2NpYXRpb25zIAoKIyMjIEFXIGNvbnNpc3RlbmN5CmBgYHtyfQpkMCAlPiUgCiAgZ2dwbG90KGFlcyhhd2NfcHJvcCwgcmVzaWRfc3ltcHRvbXMpKSArCiAgZ2VvbV9wb2ludChzaXplID0gNCwgYWxwaGEgPSAxLzIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzaXplID0gMywgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgYnJlYWtzID0gc2VxLmludCgwLCAxLCAuMTApLAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwKICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgaGp1c3QgPSAuNSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIgogICkgKwogIGxhYnMoCiAgICB4ID0gIkNvbnNpc3RlbmN5IG9mIGFkdWx0IHdvcmRzIGluIGRhaWx5IGxpZmUiLAogICAgeSA9ICJUb2RkbGVyIHN5bXB0b21zIG9mIHBzeWNob3BhdGhvbG9neVxuKHJlc2lkdWFscykiCiAgKQoKZ2dzYXZlKAogICJ+L0JveC9sdWN5X2tpbmdfZmlsZXMvQkFCSUVTL2xlbmFfc3ltcHRvbXMvbWFudXNjcmlwdC9kZXZfc2NpZW5jZS9wbG90cy9hd19wcm9wX3N5bXB0b21zLnBuZyIsCiAgd2lkdGggPSA3LAogIGhlaWdodCA9IDYKKQpgYGAKIyMjIENUIGNvbnNpc3RlbmN5CmBgYHtyfQpkMCAlPiUgCiAgZ2dwbG90KGFlcyhjdGNfcHJvcCwgcmVzaWRfc3ltcHRvbXMpKSArCiAgZ2VvbV9wb2ludChzaXplID0gNCwgYWxwaGEgPSAxLzIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzaXplID0gMywgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgYnJlYWtzID0gc2VxLmludCgwLCAxLCAuMTApLAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwKICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgaGp1c3QgPSAuNSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIgogICkgKwogIGxhYnMoCiAgICB4ID0gIkNvbnNpc3RlbmN5IG9mIGNvbnZlcnNhdGlvbmFsIHR1cm5zIGluIGRhaWx5IGxpZmUiLAogICAgeSA9ICJUb2RkbGVyIHN5bXB0b21zIG9mIHBzeWNob3BhdGhvbG9neVxuKHJlc2lkdWFscykiCiAgKQoKZ2dzYXZlKAogICJ+L0JveC9sdWN5X2tpbmdfZmlsZXMvQkFCSUVTL2xlbmFfc3ltcHRvbXMvbWFudXNjcmlwdC9kZXZfc2NpZW5jZS9wbG90cy9jdGNfcHJvcF9zeW1wdG9tcy5wbmciLAogIHdpZHRoID0gNywKICBoZWlnaHQgPSA2CikKYGBgCiMjIyBDb25zaXN0ZW5jeSAKYGBge3J9CmQwICU+JSAKICBkcGx5cjo6c2VsZWN0KGN0Y19wcm9wLCBhd2NfcHJvcCwgcmVzaWRfc3ltcHRvbXMpICU+JSAKICByZW5hbWUoCiAgICBgQ1QgY29uc2lzdGVuY3lgID0gY3RjX3Byb3AsCiAgICBgQVcgY29uc2lzdGVuY3lgID0gYXdjX3Byb3AKICApICU+JSAKICBnYXRoZXIobWVhc3VyZSwgdmFsdWUsIC1yZXNpZF9zeW1wdG9tcykgJT4lIAogIGdncGxvdChhZXModmFsdWUsIHJlc2lkX3N5bXB0b21zKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQsIGFscGhhID0gMS8yKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2l6ZSA9IDMsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cygKICAgIGJyZWFrcyA9IHNlcS5pbnQoMCwgMSwgLjE1KSwKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKQogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksCiAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIGhqdXN0ID0gLjUpLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIKICApICsKICBsYWJzKAogICAgeCA9ICJDb25zaXN0ZW5jeSBvZiBsYW5ndWFnZSBpbnB1dCBpbiBkYWlseSBsaWZlIiwKICAgIHkgPSAiVG9kZGxlciBzeW1wdG9tcyBvZiBwc3ljaG9wYXRob2xvZ3lcbihyZXNpZHVhbHMpIgogICkgKwogIGZhY2V0X2dyaWQoLn5tZWFzdXJlLCBzY2FsZXMgPSAiZnJlZSIpCgpnZ3NhdmUoCiAgIn4vQm94L2x1Y3lfa2luZ19maWxlcy9CQUJJRVMvbGVuYV9zeW1wdG9tcy9tYW51c2NyaXB0L2Rldl9zY2llbmNlL3Bsb3RzL2N0Y19hd2NfcHJvcF9zeW1wdG9tcy5lcHMiLAogIHdpZHRoID0gMTAsCiAgaGVpZ2h0ID0gNiwKICBkcGkgPSAxMDAwCikKYGBgCgojIyBJbmZhbnQgdm9jYWxpemF0aW9ucwpgYGB7cn0KZDAgJT4lIAogIGdncGxvdChhZXMoY3ZjX2hvdXJfbWF4LCByZXNpZF9zeW1wdG9tcykpICsKICBnZW9tX3BvaW50KHNpemUgPSA0LCBhbHBoYSA9IDEvMikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNpemUgPSAzLCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICBicmVha3MgPSBzZXEuaW50KDAsIDEwMDAsIDEwMCkKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLAogICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBoanVzdCA9IC41KSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiCiAgKSArCiAgbGFicygKICAgIHggPSAiUXVhbnRpdHkgb2YgaW5mYW50IHZvY2FsaXphdGlvbnMgaW4gZGFpbHkgbGlmZSIsCiAgICB5ID0gIlRvZGRsZXIgc3ltcHRvbXMgb2YgcHN5Y2hvcGF0aG9sb2d5XG4ocmVzaWR1YWxzKSIKICApCgpnZ3NhdmUoCiAgIn4vQm94L2x1Y3lfa2luZ19maWxlcy9CQUJJRVMvbGVuYV9zeW1wdG9tcy9tYW51c2NyaXB0L2Rldl9zY2llbmNlL3Bsb3RzL2N2X21heF9zeW1wdG9tcy5wbmciLAogIHdpZHRoID0gNywKICBoZWlnaHQgPSA2CikKYGBgCgojIyBFbGFzdGljIG5ldCByZWdyZXNzaW9uIHdpdGggTEVOQSB2YXJpYWJsZXMgYW5kIGNvdmFyaWF0ZXMKCiMjIyBQcmVwYXJlIGRhdGEKYGBge3J9Cnpfc2NvcmUgPC0gZnVuY3Rpb24oeCkgewogIGRpZmZfbXUgPC0geCAtIG1lYW4oeCwgbmEucm0gPSBUKQogIHNkIDwtIHNkKHgsIG5hLnJtID0gVCkKICBkaWZmX211IC8gc2QKfQpgYGAKCmBgYHtyfQpkMF9lbiA8LQogIGQwICU+JSAKICBkcGx5cjo6c2VsZWN0KAogICAgaXRzZWFfc3ltcHRvbXMsCiAgICBjdGNfcHJvcCwKICAgIGF3Y19wcm9wLAogICAgY3RjX2hvdXJfbWF4LAogICAgYXdjX2hvdXJfbWF4LAogICAgY3ZjX2hvdXJfbWF4LAogICAgY2VzZF90NCwKICAgIE5FRwogICkgJT4lIAogIG11dGF0ZV9hdCgKICAgIHZhcnMoaXRzZWFfc3ltcHRvbXM6TkVHKSwKICAgIGZ1bnMoel9zY29yZSkKICApICU+JSAKICBuYS5vbWl0KCkKYGBgCgpgYGB7cn0KcHJlZGljdG9ycyA8LSAKICBkMF9lbiAlPiUgCiAgZHBseXI6OnNlbGVjdCgtaXRzZWFfc3ltcHRvbXMpICU+JSAKICBhcy5tYXRyaXgoKQogIApzeW1wdG9tcyA8LSB6X3Njb3JlKGQwX2VuJGl0c2VhX3N5bXB0b21zKQpgYGAKCiMjIyBSdW4gbW9kZWwgb3ZlciAxMDAgaW5jcmVhc2luZ2x5IHJlbGF4ZWQgbGFtYmRhIHZhbHVlcwpgYGB7cn0KZml0X25ldCA8LSBnbG1uZXQocHJlZGljdG9ycywgc3ltcHRvbXMsIGZhbWlseSA9ICJnYXVzc2lhbiIpCnBsb3QoZml0X25ldCwgbGFiZWwgPSBUUlVFKQpgYGAKCiMjIyBSdW4gbGVhdmUtb25lLW91dCBjcm9zcyB2YWxpZGF0aW9uIHRvIGlkZW50aWZ5IG9wdGltYWwgbGFtYmRhIHZhbHVlCklmIG5mb2xkcyBpcyBzZXQgdG8gdGhlIHNhbXBsZSBzaXplID0gbGVhdmUtb25lLW91dCBDVgpodHRwczovL3NjaXBoeS1zdGF0cy5jb20vcG9zdC8yMDE5LTAxLTI1LWZpbmFsaXppbmctZ2xtbmV0LW1vZGVscy8KUnVubmluZyB0aGUgQ1YgMTAwIHRpbWVzIHRvIG1pbmltaXplIHNpbXVsYXRpb24gZXJyb3IuIApgYGB7cn0KIyBydW4gY3Jvc3MgdmFsaWRhdGlvbgpzZXQuc2VlZCgxMjMpCgpsYW1iZGFNaW5zIDwtIGMoKQoKZm9yIChpIGluIDE6MTAwKSB7CiAgZml0X2N2IDwtIGN2LmdsbW5ldCgKICAgIHByZWRpY3RvcnMsIAogICAgc3ltcHRvbXMsIAogICAgdHlwZS5tZWFzdXJlID0gIm1zZSIsIAogICAgZmFtaWx5ID0gImdhdXNzaWFuIiwgCiAgICBhbHBoYSA9IC41LAogICAgbmZvbGRzID0gOTYsCiAgICBncm91cGVkID0gRkFMU0UKICApCiAgbGFtYmRhTWlucyA8LSBjYmluZChsYW1iZGFNaW5zLCBmaXRfY3YkbGFtYmRhLm1pbikKfQpgYGAKCmBgYHtyfQojIHNhdmUgbGFtYmRhIGNvcnJlc3BvbmRpbmcgdG8gbWluaW1hbCBtc2UgdG8gYSB0aWJibGUKbGFtYmRhTWlucyA8LSBhc190aWJibGUobGFtYmRhTWlucykKbGFtYmRhTWlucyA8LQogIGxhbWJkYU1pbnMgJT4lCiAgZ2F0aGVyKHJ1biwgbGFtYmRhTWluLCBWMTpWMTAwKSAKCiMgY2FsY3VsYXRlIG1lYW4gbGFtYmRhIHZhbHVlIApsYW1iZGFGaW5hbCA8LSBtZWFuKGxhbWJkYU1pbnMkbGFtYmRhTWluKQpgYGAKCiMjIyBQcmludCBjb2VmZmljaWVudHMgZm9yIG1vZGVsIHdpdGggb3B0aW1hbCBsYW1iZGEgCmBgYHtyfQpmaXRfbmV0X2ZpbmFsIDwtIGdsbW5ldChwcmVkaWN0b3JzLCBzeW1wdG9tcywgZmFtaWx5ID0gImdhdXNzaWFuIiwgYWxwaGEgPSAuNSwgbGFtYmRhID0gbGFtYmRhRmluYWwpCmNvZWZzIDwtIGNvZWYoZml0X25ldF9maW5hbCkgCgplbl9jb2VmX3RibCA8LSAKICB0aWR5KGNvZWYoZml0X25ldF9maW5hbCkpICAlPiUgCiAgZHBseXI6OnNlbGVjdCgtY29sdW1uKSAlPiUgCiAgcmVuYW1lKAogICAgVmFyaWFibGUgPSByb3csCiAgICBgRWxhc3RpYyBuZXQgZXN0aW1hdGVgID0gdmFsdWUKICApICU+JSAKICBtdXRhdGUoCiAgICBWYXJpYWJsZSA9IHJlY29kZSgKICAgICAgVmFyaWFibGUsCiAgICAgICIoSW50ZXJjZXB0KSIgPSAiKEludGVyY2VwdCkiLAogICAgICAiY3RjX3Byb3AiID0gIkNUIGNvbnNpc3RlbmN5IiwKICAgICAgImF3Y19wcm9wIiA9ICJBVyBjb25zaXN0ZW5jeSIsCiAgICAgICJjdGNfaG91cl9tYXgiID0gIkNUIHF1YW50aXR5IiwKICAgICAgImN2Y19ob3VyX21heCIgPSAiSW5mYW50IHZvY2FsaXphdGlvbnMiLAogICAgICAiY2VzZF90NCIgPSAiTWF0ZXJuYWwgZGVwcmVzc2l2ZSBzeW1wdG9tcyIsCiAgICAgICJORUciID0gIkluZmFudCBuZWdhdGl2ZSBhZmZlY3Rpdml0eSIKICAgICkKICApICU+JSAKICBtdXRhdGVfYXQodmFycyhgRWxhc3RpYyBuZXQgZXN0aW1hdGVgKSAsIHJvdW5kLCAyKQpgYGAKCiMjIyBDYWxjdWxhdGUgRU4gbW9kZWwgcGVyZm9ybWFuY2UKYGBge3J9CiMgc2F2ZSBtb2RlbCBtYXRyaXgKWCA8LSBtb2RlbC5tYXRyaXgoaXRzZWFfc3ltcHRvbXMgfiAuLCBkMF9lbikKCiMgZ2V0IHByZWRpY3RlZCB2YWx1ZXMKeV9oYXQgPC0gbWF0cml4KFgsIG5jb2wgPSA4KSAlKiUgYXMubWF0cml4KGNvZWZzKQoKIyBjYWxjdWxhdGUgUi1zcXVhcmVkCnJfc3EgPC0gMSAtIChzdW0oKHlfaGF0WywgMV0gLSBzeW1wdG9tcyleMikgLyBzdW0oKHN5bXB0b21zIC0gbWVhbihzeW1wdG9tcykpXjIpKQpgYGAKCiMjIyBFdmFsdWF0ZSBtb2RlbCBwZXJmb3JtYW5jZQoKYGBge3J9CmZvciAoaSBpbiAxMDAwKSB7CiAgZml0X3JyX2N2IDwtIGN2LmdsbW5ldChwcmVkaWN0b3JzLCBzeW1wdG9tcywgdHlwZS5tZWFzdXJlID0gIm1zZSIsIGFscGhhID0gLjUsIGZhbWlseSA9ICJnYXVzc2lhbiIpCiAgbGFtYmRhTWlucyA8LSBjYmluZChsYW1iZGFNaW5zLCBmaXRfcnJfY3YkbGFtYmRhLm1pbikKfQpgYGAKCiMjIEFkZGl0aW9uYWwgYW5hbHlzZXMKCiMjIyBDb3ZhcnlpbmcgbWF0ZXJuYWwgc2Vuc2l0aXZpdHkgCgojIyMjIEFXIApgYGB7cn0Kc3ltX2F3X21zIDwtIAogIGxtKAogICAgc2NhbGUoaXRzZWFfc3ltcHRvbXMpIH4gCiAgICAgIHNjYWxlKGF3Y19wcm9wKSArIAogICAgICBzY2FsZShjZXNkX3Q0KSArCiAgICAgIHNjYWxlKE5FRykgKwogICAgICBzY2FsZShzZW5zX2ZwKSArCiAgICAgIHNjYWxlKHNlbnNfcl9zZnApLAogICAgZGF0YSA9IGQwIAogICkKCgpjYWxjLnJlbGltcChzeW1fYXdfbXMpCm1vZGVsX3BhcmFtZXRlcnMoc3ltX2F3X21zKQpgYGAKCmBgYHtyfQpzeW1fY3RfbXMgPC0gCiAgbG0oCiAgICBzY2FsZShpdHNlYV9zeW1wdG9tcykgfiAKICAgICAgc2NhbGUoY3RjX3Byb3ApICsKICAgICAgc2NhbGUoY2VzZF90NCkgKwogICAgICBzY2FsZShORUcpICsKICAgICAgc2NhbGUoc2Vuc19mcCkgKwogICAgICBzY2FsZShzZW5zX3Jfc2ZwKSwKICAgIGRhdGEgPSBkMCAKICApCgpjYWxjLnJlbGltcChzeW1fY3RfbXMpCm1vZGVsX3BhcmFtZXRlcnMoc3ltX2N0X21zKQpgYGAKCmBgYHtyfQpjb3IudGVzdChkMCRzZW5zX2ZwLCBkMCRpdHNlYV9zeW1wdG9tcykKY29yLnRlc3QoZDAkc2Vuc19yX3NmcCwgZDAkaXRzZWFfc3ltcHRvbXMpCmBgYAoKIyMjIFdobyBpcyB0YWxraW5nPwoKYGBge3J9CmQwX2ZvbGxvdyA8LQogIGQwICU+JSAKICBmaWx0ZXIoCiAgICBsZW5hX2NhcmVnaXZlcnNfX18xICE9IDAgfAogICAgICBsZW5hX2NhcmVnaXZlcnNfX18yICE9IDAgfAogICAgICBsZW5hX2NhcmVnaXZlcnNfX18zICE9IDAgfAogICAgICBsZW5hX2NhcmVnaXZlcnNfX180ICE9IDAgfAogICAgICBsZW5hX2NhcmVnaXZlcnNfX181ICE9IDAgfAogICAgICBsZW5hX2NhcmVnaXZlcnNfX182ICE9IDAgfAogICAgICBsZW5hX2NhcmVnaXZlcnNfX183ICE9IDAgfAogICAgICBsZW5hX2NhcmVnaXZlcnNfX184ICE9IDAgfAogICAgICBsZW5hX2NhcmVnaXZlcnNfX185ICE9IDAgfAogICAgICBsZW5hX2NhcmVnaXZlcnNfX18xMCAhPSAwCiAgKSAlPiUgCiAgcmVuYW1lKAogICAgbW9tX3ByZXNlbnQgPSBsZW5hX2NhcmVnaXZlcnNfX18xLAogICAgZGFkX3ByZXNlbnQgPSBsZW5hX2NhcmVnaXZlcnNfX18yLAogICAgZGF5Y2FyZV9wcmVzZW50ID0gbGVuYV9jYXJlZ2l2ZXJzX19fMywKICAgIG5hbm55X3ByZXNlbnQgPSBsZW5hX2NhcmVnaXZlcnNfX180LAogICAgc2libGluZ19wcmVzZW50ID0gbGVuYV9jYXJlZ2l2ZXJzX19fNSwKICAgIGNvdXNpbl9wcmVzZW50ID0gbGVuYV9jYXJlZ2l2ZXJzX19fNiwKICAgIGdyYW5kcGFyZW50X3ByZXNlbnQgPSBsZW5hX2NhcmVnaXZlcnNfX183LAogICAgZnJpZW5kc19wcmVzZW50ID0gbGVuYV9jYXJlZ2l2ZXJzX19fOCwKICAgIHJlbGF0aXZlX3ByZXNlbnQgPSBsZW5hX2NhcmVnaXZlcnNfX185LCAjYW55IG90aGVyIHJlbGF0aXZlCiAgICBvdGhlcl9wcmVzZW50ID0gbGVuYV9jYXJlZ2l2ZXJzX19fMTAKICApCmBgYAoKYGBge3J9CmQwX2ZvbGxvdyAlPiUgCiAgY291bnQoIWlzLm5hKHBlcmNlbnRfbW90aGVyKSkKCmQwX2ZvbGxvdyAlPiUKICBzdW1tYXJpc2VfYXQoCiAgICB2YXJzKHBlcmNlbnRfbW90aGVyKSwKICAgIGZ1bnMobWVhbiwgbWVkaWFuLCBzZCwgbWluLCBtYXgpLCBuYS5ybSA9IFRSVUUKICApCgpjb3IudGVzdChkMF9mb2xsb3ckcGVyY2VudF9tb3RoZXIsIGQwX2ZvbGxvdyRjdGNfcHJvcCwgbWV0aG9kID0gInNwZWFybWFuIikKY29yLnRlc3QoZDBfZm9sbG93JHBlcmNlbnRfbW90aGVyLCBkMF9mb2xsb3ckYXdjX3Byb3AsIG1ldGhvZCA9ICJzcGVhcm1hbiIpCmNvci50ZXN0KGQwX2ZvbGxvdyRwZXJjZW50X21vdGhlciwgZDBfZm9sbG93JGN0Y19ob3VyX21heCwgbWV0aG9kID0gInNwZWFybWFuIikKY29yLnRlc3QoZDBfZm9sbG93JHBlcmNlbnRfbW90aGVyLCBkMF9mb2xsb3ckYXdjX2hvdXJfbWF4LCBtZXRob2QgPSAic3BlYXJtYW4iKQpjb3IudGVzdChkMF9mb2xsb3ckcGVyY2VudF9tb3RoZXIsIGQwX2ZvbGxvdyRjdmNfaG91cl9tYXgsIG1ldGhvZCA9ICJzcGVhcm1hbiIpCgpjb3IudGVzdChkMF9mb2xsb3ckcGVyY2VudF9tb3RoZXIsIGQwX2ZvbGxvdyRpdHNlYV9zeW1wdG9tcywgbWV0aG9kID0gInNwZWFybWFuIikKYGBgCgpgYGB7cn0KZDBfZm9sbG93ICU+JQogIGNvdW50KG1vbV9wcmVzZW50KSAlPiUgCiAgbXV0YXRlKAogICAgcGVyID0gbiAvIHN1bShuKQogICkKCmQwX2ZvbGxvdyAlPiUKICBjb3VudChkYWRfcHJlc2VudCkgJT4lIAogIG11dGF0ZSgKICAgIHBlciA9IG4gLyBzdW0obikKICApCgpkMF9mb2xsb3cgJT4lCiAgY291bnQobW9tX3ByZXNlbnQsIGRhZF9wcmVzZW50KSAlPiUgCiAgbXV0YXRlKAogICAgcGVyID0gbiAvIHN1bShuKQogICkKCmQwX2ZvbGxvdyAlPiUKICBjb3VudChkYXljYXJlX3ByZXNlbnQpICU+JSAKICBtdXRhdGUoCiAgICBwZXIgPSBuIC8gc3VtKG4pCiAgKQoKZDBfZm9sbG93ICU+JQogIGNvdW50KG5hbm55X3ByZXNlbnQpICU+JSAKICBtdXRhdGUoCiAgICBwZXIgPSBuIC8gc3VtKG4pCiAgKQoKZDBfZm9sbG93ICU+JQogIGNvdW50KGdyYW5kcGFyZW50X3ByZXNlbnQpICU+JSAKICBtdXRhdGUoCiAgICBwZXIgPSBuIC8gc3VtKG4pCiAgKQoKZDBfZm9sbG93ICU+JQogIGNvdW50KGZyaWVuZHNfcHJlc2VudCkgJT4lIAogIG11dGF0ZSgKICAgIHBlciA9IG4gLyBzdW0obikKICApCgpkMF9mb2xsb3cgJT4lCiAgY291bnQocmVsYXRpdmVfcHJlc2VudCkgJT4lIAogIG11dGF0ZSgKICAgIHBlciA9IG4gLyBzdW0obikKICApCgpkMF9mb2xsb3cgJT4lCiAgY291bnQoCiAgICBtb21fcHJlc2VudCwgCiAgICBkYWRfcHJlc2VudCwgCiAgICBkYXljYXJlX3ByZXNlbnQsIAogICAgbmFubnlfcHJlc2VudCwgCiAgICBncmFuZHBhcmVudF9wcmVzZW50CiAgKSAlPiUgCiAgbXV0YXRlKAogICAgcGVyID0gbiAvIHN1bShuKQogICkgJT4lIAogIGFycmFuZ2UobikKCmBgYAoKYGBge3J9CmQwX2ZvbGxvdyAlPiUgCiAgY291bnQocGVyY2VudF9tb3RoZXIpICU+JSAKICBhcnJhbmdlKGRlc2MobikpCmBgYAoKCmBgYHtyfQpkMF9mb2xsb3cgPC0KICBkMF9mb2xsb3cgJT4lIAogIG11dGF0ZSgKICAgIG5fY2FyZWdpdmVycyA9IAogICAgICBtb21fcHJlc2VudCArCiAgICAgIGRhZF9wcmVzZW50ICsKICAgICAgZGF5Y2FyZV9wcmVzZW50ICsKICAgICAgZ3JhbmRwYXJlbnRfcHJlc2VudCArCiAgICAgIG5hbm55X3ByZXNlbnQgKwogICAgICBmcmllbmRzX3ByZXNlbnQgKwogICAgICByZWxhdGl2ZV9wcmVzZW50CiAgKQoKY29yLnRlc3QoZDBfZm9sbG93JGl0c2VhX3N5bXB0b21zLCBkMF9mb2xsb3ckbl9jYXJlZ2l2ZXJzLCBtZXRob2QgPSAic3BlYXJtYW4iKQpgYGAKCiMjIyBMRU5BIHJlY29yZGluZyBjb3JyZWxhdGlvbnM6IGR1cmF0aW9uLCBldGMuIApgYGB7cn0KZDAgJT4lIAogIGRwbHlyOjpzZWxlY3QoCiAgICBjdGNfcHJvcCwKICAgIGF3Y19wcm9wLAogICAgY3RjX2hvdXJfbWF4LAogICAgYXdjX2hvdXJfbWF4LAogICAgZHVyYXRpb25fYW5hbHl6ZWQsCiAgICBkdXJhdGlvbl90b3RhbCwKICAgIGN0X2ZpcnN0X3RpbWUsCiAgICBjdF9sYXN0X3RpbWUKICApICU+JSAKICBjb3JyZWxhdGUobWV0aG9kID0gInNwZWFybWFuIikgJT4lIAogIGZhc2hpb24oKQoKY29yLnRlc3QoZDAkY3RjX3Byb3AsIGQwJGR1cmF0aW9uX2FuYWx5emVkLCBtZXRob2QgPSAicGVhcnNvbiIpCmNvci50ZXN0KGQwJGF3Y19wcm9wLCBkMCRkdXJhdGlvbl9hbmFseXplZCwgbWV0aG9kID0gInBlYXJzb24iKQpjb3IudGVzdChkMCRjdGNfaG91cl9tYXgsIGQwJGR1cmF0aW9uX2FuYWx5emVkLCBtZXRob2QgPSAicGVhcnNvbiIpCmNvci50ZXN0KGQwJGF3Y19ob3VyX21heCwgZDAkZHVyYXRpb25fYW5hbHl6ZWQsIG1ldGhvZCA9ICJwZWFyc29uIikKCmNvci50ZXN0KGQwJGN0Y19wcm9wLCBkMCRjdF9maXJzdF90aW1lLCBtZXRob2QgPSAicGVhcnNvbiIpCmNvci50ZXN0KGQwJGF3Y19wcm9wLCBkMCRjdF9maXJzdF90aW1lLCBtZXRob2QgPSAicGVhcnNvbiIpCmNvci50ZXN0KGQwJGN0Y19ob3VyX21heCwgZDAkY3RfZmlyc3RfdGltZSwgbWV0aG9kID0gInBlYXJzb24iKQpjb3IudGVzdChkMCRhd2NfaG91cl9tYXgsIGQwJGN0X2ZpcnN0X3RpbWUsIG1ldGhvZCA9ICJwZWFyc29uIikKCmNvci50ZXN0KGQwJGN0Y19wcm9wLCBkMCRjdF9sYXN0X3RpbWUsIG1ldGhvZCA9ICJwZWFyc29uIikKY29yLnRlc3QoZDAkYXdjX3Byb3AsIGQwJGN0X2xhc3RfdGltZSwgbWV0aG9kID0gInBlYXJzb24iKQpjb3IudGVzdChkMCRjdGNfaG91cl9tYXgsIGQwJGN0X2xhc3RfdGltZSwgbWV0aG9kID0gInBlYXJzb24iKQpjb3IudGVzdChkMCRhd2NfaG91cl9tYXgsIGQwJGN0X2xhc3RfdGltZSwgbWV0aG9kID0gInBlYXJzb24iKQoKY29yLnRlc3QoZDAkY3RfbGFzdF90aW1lLCBkMCRjdF9maXJzdF90aW1lLCBtZXRob2QgPSAicGVhcnNvbiIpCmBgYAoKCgpgYGB7cn0KZDAgJT4lIAogIGdncGxvdChhZXMoZHVyYXRpb25fYW5hbHl6ZWQsIGF3Y19wcm9wKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKCmQwICU+JSAKICBnZ3Bsb3QoYWVzKGN0X2ZpcnN0X3RpbWUsIGF3Y19ob3VyX21heCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCgpkMCAlPiUgCiAgZ2dwbG90KGFlcyhjdF9maXJzdF90aW1lLCBjdGNfaG91cl9tYXgpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQoKZDAgJT4lIAogIGdncGxvdChhZXMoY3RfbGFzdF90aW1lLCBhd2NfcHJvcCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCgpkMCAlPiUgCiAgZ2dwbG90KGFlcyhjdF9sYXN0X3RpbWUsIGN0Y19wcm9wKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKYGBgCgojIyMgQ1QgYW5kIEFXIHJhdGUgdmFyaWFibGVzIGFuZCBzeW1wdG9tcwpgYGB7cn0KY29yLnRlc3QoZDAkY3RjX3JhdGUsIGQwJGl0c2VhX3N5bXB0b21zKQpjb3IudGVzdChkMCRhd2NfcmF0ZSwgZDAkaXRzZWFfc3ltcHRvbXMpCmBgYAoKYGBge3J9CndyaXRlX2NzdihkMCwgIn4vQm94L2x1Y3lfa2luZ19maWxlcy9CQUJJRVMvbGVuYV9zeW1wdG9tcy9tYW51c2NyaXB0L2Rldl9zY2llbmNlL3N1YjIva2luZ19hbmFseXplZF9kYXRhXzIwMjAxMDEzLmNzdiIpCmBgYAoK